【发布时间】:2013-04-07 15:37:33
【问题描述】:
我无法解释为什么我的代码中没有调用 onPostExecute。我之前已经成功地将几乎这个确切的代码用于不同的应用程序。它在return result; 之前打印'onPreExecute' 和从doInBackground 获取JSON 的成功结果,但随后onPostExecute 不打印任何内容——无论是否使用超级调用——而且不会将我的字符串返回给UI 线程。有什么想法吗?
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()方法的主线程是没有意义的。此外,您遇到的问题总是会出现,或者只是在加载时旋转屏幕? -
总是出现,与轮换无关。而且我必须阻塞主线程,以便在调用将其加载到本地数据库的方法之前获得 JSON 结果,否则它会因空指针而失败。
-
网络请求完成后你不能在
AsyncTask中执行你的数据库加载吗?我不确定这是不是问题(可能是),但可以肯定的是,您当前的方法会导致其他问题(例如 ANR)。 -
哦,我试一试。您的意思是在 doInBackground 中使用数据库加载方法,而不是通过 onPostExecute 传递给 UI 线程?
-
我认为问题是由你睡眠主线程的方式引起的。您需要将输出语句
System.out.println("JSONResult at Activity:"+jsonResult);放在 onPostExecute() 中,并且在 Async 运行时不要让主线程休眠。附带说明一下,您应该使用 androids Log 类而不是System.out