AsyncTask를 확장하는 별도의 클래스 LongOperation을 사용하여 액세스하는 서버의 데이터에 액세스하는 안드로이드 응용 프로그램이 있습니다. 이제 LongOperation 클래스에서 데이터를 가져 오지만이 데이터를 다른 클래스 개체에 복사 할 수 없으므로 sqlitedb에 저장해야합니다. sqlitedb에 직접 데이터를 쓰려고 시도했지만 LongOperation 클래스가 활동이 아니므로 super (새 MainActivity(), DATABASE_NAME, null, DATABASE_VERSION)에 컨텍스트를 전달할 수 없습니다.필요에 따라 sqlitedb 데이터를 가져 오는 개체에 클래스 라이브러리를 사용하여 액세스합니다. Activity 인 MainActivity 클래스에서 버튼 클릭으로 LongOperation 클래스를 호출하지만 여기에서 컨텍스트가 작동하지 않습니다. 다음은 호출 및 데이터 가져 오기 절차를 보여주는 관련 발췌 부분입니다. (별도의 파일에서) (별도의 파일에)한 클래스의 한 객체에서 다른 클래스의 데이터를 다른 클래스의 객체로 복사
MainActivity 버튼을 눌러 코드
import LibPack.UpdateData;
public static UpdateData upd;
public void onClick(View arg0) {
upd = new UpdateData();
LongOperation.getUserData = true;
lo = new LongOperation();
lo.execute("");
}
LongOperation 클래스 코드
import LibPack.UpdateData;
public static class LongOperation extends AsyncTask<String, Void, String> {
public static UpdateData upd;
@Override
protected String doInBackground(String... params) {
if (getUserData) {
upd = *data fetched from server*
}
}
그래서 어떻게 다시이 클래스에서 데이터를 반환 할 MainActivity? 아니면 다른 클래스를 통해 액세스 할 수 있도록 파일에 데이터를 저장하는 다른 방법이 있습니까? 객체의 데이터는 string [] 형식과 키 값 쌍입니다. 이 문제는 LongOperation 클래스가 비 활동 클래스이므로 발생합니다. 따라서 파일 작성자 또는 sharedpreferences를 사용하는 동안 컨텍스트를 전달할 수있는 방법이 없습니다.
편집 1 :
MainActivity
package com.sam.vehicle;
import com.example.vehicle.R;
import com.sam.vehicle.CommonData.LongOperation;
import LibPack.UpdateData;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
public class MainActivity extends Activity implements AsyncResponse{
Button b;
public static LongOperation lo = new LongOperation();
public static String resp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lo.delegate = this;
b = (Button) findViewById(R.id.btnProceed);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
upd = new UpdateData();
CommonData.getUserData = true;
System.out.println("Before execute");**//prints fine**
lo.execute("");
System.out.println("At main extract");**//prints with previous sysout**
System.out.println("At main extract resp = "+resp);**//prints = null**
Intent ii = new Intent(arg0.getContext(), LoginActivity.class);
ii.putExtra("number", phoneNumber.getText().toString());
startActivity(ii);
}
});
}
@Override
public void processFinish(String output) {
// TODO Auto-generated method stub
System.out.println("Executed processFinish in main. output = "+output);**//doesn't print
resp = output;
}
}
AsyncTask를 클래스 :
package com.sam.vehicle;
import com.example.vehicle.R;
public class CommonData {
public static boolean getUserData = false;
public static String resp;
public static class LongOperation extends AsyncTask<String, Void, String> {
public AsyncResponse delegate = null;
@Override
protected void onPostExecute(String result) {
System.out.println("In commondata onpostexe");**//doesn't print**
delegate.processFinish(result);
}
@Override
protected String doInBackground(String... params) {
if (getUserData) {
sendToServer = false;
try {
upd = (UpdateData) stringToObject(resp);
for (int i = 0; i < upd.pass.length; i++) {
System.out.println("upd.usn["+i+"]"+upd.usn[i]);
System.out.println("upd.pass["+i+"]"+upd.pass[i]);
}**//prints fine here**
System.out.println("in commondata resp="+resp);**//prints fine here**
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("resp from common return = "+resp);**//doesn't print**
return resp;
}
}
AsyncTask 설명서를 읽어야합니다. 이 부분은 여기에서 다룹니다. ** "치명적인 예외 : – Jeroen