我無法解釋爲什麼onPostExecute沒有在我的代碼中被調用。我以前已經成功使用幾乎這個確切的代碼與不同的應用程序。它打印'onPreExecute'和從doInBackground獲取JSON的成功結果,只是在return result;
之前,但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內部類是這樣的:
@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結果,或者使用空指針失敗。 –
網絡請求完成後,你不能在'AsyncTask'中執行數據庫加載嗎?我不確定這是否是問題(可能是),但肯定您目前的方法會導致您遇到其他問題(例如ANR)。 – rciovati