当前位置: 首页 > 知识库问答 >
问题:

为什么我得到一个NullPointer异常与AlertDital在一个async任务?

田向荣
2023-03-14

我有一个启动屏幕,它运行一个从API下载数据的asyncTask。在该任务的OnPostExecute上,我运行下一个asyncTask来发送存储的电子邮件。完成后,我需要一个AlertDialog弹出一个ok按钮,以便用户知道下载完成。我使用了这个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();

        }
}

<code>生成器上出现错误。setTitle(“销售工具包”)

共有3个答案

况嘉运
2023-03-14

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

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

到< code>onPostExecute()方法中。

王飞英
2023-03-14

不要使用. get()来执行AsyncTask,因为它将不再是异步的。而onPreExecute不会被调用?

阳兴文
2023-03-14

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

 类似资料:
  • 我用RSA算法加密和解密。当我加密一个字符串时,它工作正常。当我解密时,我得到一个错误。下面,我发布我的代码。

  • 我试图实现一个排序和未排序的数组列表。两者都扩展了一个名为AbstractArrayMyList的类,该类包含常见的操作/实现——toString、clear等。。。。 下面是我的AbstractArrayMyList代码(它实现了我定义的通用接口) 我选择对elementData进行保护,以便排序和未排序的专用数组列表可以访问并对其执行操作。这是我对排序数组列表的声明/代码 这一切都很好。然而,

  • 我有一个带有复选框的列表视图。对于每个复选框(大约有3个),它都有一个特定的AsyncTask。 我从来不知道用户选择了什么复选框,所以我不能把AlertDialog放在异步任务的末尾,因为我从来不知道用户是只选择了一个复选框,还是两个或三个。 因为AsyncTask是分步执行的(只有当第一个Async任务完成时,第二个Async任务才开始),所以我考虑在所有任务的末尾添加一个带有AlertDia

  • 我编写了这段代码,将整个以10为基数的数字转换成二进制。我相信代码就是它所需要的一切,但我无法让工作。 我在这个网站和其他网站上花了几个小时,尝试了无数次的修改,但都没有用。 我已经让代码无错误地编译,但一旦我运行它并输入程序就会崩溃。 下面是代码: 这些是java在我输入数字时抛出的异常。 我希望这是足够的信息。

  • 我正在学习“放心框架”。 我使用http://ziptasticapi.com免费的API为我的演习。 当我打电话: 我得到以下字符串: {“国家”:“美国”、“州”:“正义与发展党”、“城市”:“阿达克”} as响应字符串值。 当我尝试时: 我突然想到: JAVAlang.IllegalStateException:无法分析对象,因为响应中未指定支持的内容类型。内容类型为“文本/html”;字符