为什么我在asyncTask中使用AlertDialog获取NullPointerException?

时间:2014-07-02 20:08:53

标签: android android-asynctask android-alertdialog

我有一个运行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");

3 个答案:

答案 0 :(得分:5)

AsyncTask#onPreExecute()不接受int参数。由于您的方法具有错误的签名,因此可能永远不会被调用,因此永远不会设置builder。这是您应该使用@Override注释的典型示例。

答案 1 :(得分:0)

不要使用.get()来执行AsyncTask,因为它不再是异步。并且不会调用onPreExecute吗?

答案 2 :(得分:-1)

似乎没有调用onPreExecute()方法。如果你真的不需要在builder方法之前的任何地方使用onPostExecute(),我建议你移动

builder = new AlertDialog.Builder(SplashScreen.this);

进入onPostExecute()方法。