【问题标题】:NullPointerException when trying to show ProgressDialog from a Static AsyncTask method尝试从静态 AsyncTask 方法显示 ProgressDialog 时出现 NullPointerException
【发布时间】:2015-12-15 16:07:31
【问题描述】:

我的 MainActivity 中有一个静态 AsyncTask。我运行这个 asynctask 从 URL 下载数据。我正在尝试显示异步任务的进度对话框,但它在此行崩溃:private ProgressDialog dialog = new ProgressDialog(mContext);

我将上下文传递给 AsyncTask。

这是我的代码:

private static class MyTasksParse extends AsyncTask<String, String, JSONObject> {
    private Context mContext;
    private ProgressDialog dialog = new ProgressDialog(mContext);

    public MyTasksParse(Context context) {
        mContext = context;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        this.dialog.setCanceledOnTouchOutside(false);
        this.dialog.setMessage("Downloading Files... Please Wait...");
        this.dialog.show();
    }

    @Override
    protected JSONObject doInBackground(String... args) {
        //get the url and parse it 
        return json;
    }

    @Override
    protected void onPostExecute(JSONObject json) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }

    }
}

我尝试将mContext 转换为Activity,如下所示: private ProgressDialog dialog = new ProgressDialog(mContext); 但还是同样的错误。

我不确定我做错了什么。如果有人可以提供帮助,那就太好了!谢谢:)

【问题讨论】:

  • 尝试在onPreExecute方法中初始化
  • 确定private ProgressDialog dialog = new ProgressDialog(mContext); 行会导致问题,因为mContextnullmContext = context; 行之后移动dialog = new ProgressDialog(mContext);

标签: android android-asynctask android-alertdialog progressdialog


【解决方案1】:

既然你有NullPointerException,因为此时变量mContext为空:

    private static class MyTasksParse extends AsyncTask<String, String, JSONObject> {
        private Context mContext;
        private ProgressDialog dialog = new ProgressDialog(mContext);
...
...

这会有所帮助:

private static class MyTasksParse extends AsyncTask<String, String, JSONObject> {
    private Context mContext;
    private ProgressDialog dialog;

    public MyTasksParse(Context context) {
        mContext = context;
        dialog = new ProgressDialog(mContext)
    }

当您在构造函数中收到context 的值时,您可以正确地实例化ProgressDialog =)。

【讨论】:

  • @Mark117:因为类是静态的,所以在创建MyTasksParse 的对象时可能也会收到警告?
【解决方案2】:

当你将mContext传递给ProgressDialog的构造函数时,mContext就是null,因此抛出了NullPointerException

这应该可行:

private Context mContext;
private ProgressDialog dialog;

public MyTasksParse(Context context) {
    mContext = context;
    dialog = new ProgressDialog(mContext);
}

【讨论】:

    【解决方案3】:

    当您初始化 ProgressDialog 时,mContextnull。这就是发生崩溃的原因。

    你需要改变:

    private ProgressDialog dialog = new ProgressDialog(mContext);
    

    到:

    private ProgressDialog dialog;
    

    并在onPreExecute中初始化进度对话框:

    dialog = new ProgressDialog(mContext);
    

    【讨论】:

      【解决方案4】:

      你得到 NullPointerException 因为 mContext 是空的。 您需要在构造函数中初始化 ProgressDialog,例如

      public MyTasksParse(Context context) {
          mContext = context;
          dialog = new ProgressDialog(mContext)
      }
      

      【讨论】:

        猜你喜欢
        • 2020-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-13
        • 2015-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多