[英]Why am I getting a NullPointerException with AlertDialog in an asyncTask?
我有一个运行asyncTask
的启动屏幕,该asyncTask
从API下载数据。 在该任务的OnPostExecute
我运行下一个asyncTask
来发送存储的电子邮件。 完成此操作后,我需要使用OK按钮弹出AlertDialog
,以便用户知道下载已完成。 我用这个SO问题来达到我的目的:
AsyncTask中的Android AlertDialog
现在,当我尝试向对话框中添加属性时,我得到了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");
AsyncTask#onPreExecute()
不采用int参数。 由于您的方法签名错误,因此很可能永远不会调用它,因此永远不会设置builder
。 这是为什么应使用@Override
注释的经典示例。
不要使用.get()执行AsyncTask,因为它将不再是异步的。 并且onPreExecute将不会被调用?
似乎未调用onPreExecute()
方法。 如果您真的不需要在onPostExecute()
方法之前的任何地方使用builder
,建议您移动
builder = new AlertDialog.Builder(SplashScreen.this);
进入onPostExecute()
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.