코드에서 onPostExecute가 호출되지 않는 이유를 설명 할 수 없습니다. 이전에 다른 앱으로이 정확한 코드를 성공적으로 사용했습니다. 그것은 'onPreExecute'를 인쇄하고 return result;
직전에 doInBackground에서 JSON을 성공적으로 가져 왔지만 onPostExecute는 수퍼 호출과 함께 아무 것도 인쇄하지 않으며 UI 문자열에 내 문자열을 반환하지 않습니다. 어떤 아이디어?onPostExecute가 ASyncTask에 의해 호출되지 않습니다. execute()
public class PrivateLoadFromServer extends AsyncTask<String, Integer, String> {
InputStream is = null;
String result = null;
String error_text="";
JSONObject j = null;
String url;
SQLiteOpenHelper helper;
CustomActivity activity;
private Context context;
private ProgressDialog dialog;
private int count;
String employee;
String text;
public PrivateLoadFromServer(CustomActivity activity,String employee,String url){
this.url=url;
this.employee=employee;
this.activity=activity;
}
@Override
protected void onPreExecute() {
system.out.println("onPreExecute");
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
System.out.println("onPostExecute");
activity.setJSONResult(result);
/*
if(result!=null){
System.out.println("Task reported successful");
taskHandler.taskSuccessful(this.result);
activity.setJSONResult(this.result);
} else {
taskHandler.taskFailed();
}
*/
//return;
}
@Override
protected String doInBackground(String... params) {
System.out.println("Running aSyncTask");
// Successful code to get JSON result string from server omitted.
System.out.println("Raw at doInBackground: " + result);
return result;
편집 : 원래이 게시 한 경우, 나는이 같은 CustomActivity의 내부 클래스로 호출하여 명시 적으로 코드 어딘가에 AsyncTask를 취소하는 경우
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
helper=new DBHelper(this);
loadBasicData();
}
private void loadBasicData() {
// If you can encode all of these into one JSON Object, cool.
String url="*****" //Omitted URL.
String employee=null;
PrivateLoadFromServer syncTask = new PrivateLoadFromServer(this,employee,url);
syncTask.execute();
try {
syncTask.get(15000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TimeoutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("JSONResult at Activity:"+jsonResult); // jsonResult is null
}
}
public void setJSONResult(String result){
System.out.println("setJSONResult"+result);
this.jsonResult=result; // jsonResult is a field in the Activity.
}
비동기 작업을 수행하고 메인 쓰레드를 호출하는 것을 차단하기 위해 AsyncTask 클래스를 사용하는 것은 의미가 없다. '.get()'메서드 또한, 발생하는 문제는 항상 발생하거나로드하는 동안 화면을 회전하는 경우에만 발생합니다. – rciovati
항상 발생하며 회전과는 관련이 없습니다. 내 로컬 데이터베이스에로드하는 메서드를 호출하기 전에 JSON 결과를 갖도록 기본 스레드를 차단해야합니다. 그렇지 않으면 null 포인터가 실패합니다. –
네트워크 요청이 완료된 후'AsyncTask'에서 데이터베이스 로딩을 수행 할 수 없습니까? 이 문제 (이것이 될 수도 있음)가 확실하지 않지만, 현재 접근 방식이 다른 문제 (예 : ANR)를 유발할 수 있습니다. – rciovati