我有一个运行asyncTask
的启动画面,可以从API下载数据。在该任务的OnPostExecute
上,我运行下一个asyncTask
来发送存储的电子邮件。一旦完成,我需要AlertDialog
弹出一个ok按钮,以便用户知道下载完成。我用这个问题得到了尽可能的:
Android AlertDialog inside AsyncTask
现在,当我尝试向对话框添加属性时,我收到NullPointerException:
public class JSONParser extends AsyncTask<String, String, JSONObject> {
Context c;
public JSONParser(int api,Context c) {
this.api= api;
this.c = c;
}
...
protected void onPostExecute(JSONObject result) {
JSONObject output = new JSONEmailParser(c).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, new String[] {null,null,null,null}).get();
}
}
public class JSONEmailParser extends AsyncTask<String, String, JSONObject> {
Context c;
AlertDialog.Builder builder;
public JSONEmailParser(Context c){
this.c = c;
}
protected void onPreExecute(int api){
builder = new AlertDialog.Builder(SplashScreen.this);
}
...
protected void onPostExecute(JSONObject result) {
setLastUpdate();
builder.setTitle("Sales Toolkit");
builder.setCancelable(false);
builder.setMessage("Download Complete");
builder.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();
endSplash();
}
});
builder.show();
}
}
错误出现在builder.setTitle("Sales Toolkit");
答案 0 :(得分:5)
AsyncTask#onPreExecute()
不接受int参数。由于您的方法具有错误的签名,因此可能永远不会被调用,因此永远不会设置builder
。这是您应该使用@Override
注释的典型示例。
答案 1 :(得分:0)
不要使用.get()来执行AsyncTask,因为它不再是异步。并且不会调用onPreExecute吗?
答案 2 :(得分:-1)
似乎没有调用onPreExecute()
方法。如果你真的不需要在builder
方法之前的任何地方使用onPostExecute()
,我建议你移动
builder = new AlertDialog.Builder(SplashScreen.this);
进入onPostExecute()
方法。