安卓系统-在使用AsyncTask时显示取消进度对话框时遇到问题



我正在使用AsyncTask进行url请求,并希望在处理请求时显示某种进度微调器。AsyncTask类位于扩展Activity的另一个活动VerificationActivity中。应用程序在这一行崩溃:dialog = new ProgressDialog(context);可能问题出在应用程序的context上,我尝试了VerificationActivity.this并创建了VerificationActivity的本地实例,并将其作为上下文传递。

        SmsTask smsTask = new SmsTask(VerificationActivity.this);
    /*
    * some code
    */
 class SmsTask extends AsyncTask<String,Void, Boolean> {
    final AtomicBoolean b = new AtomicBoolean(false);
    private Context mContext;
    ProgressDialog pd;
    SmsTask(Context context){
        this.mContext = context;
    }
    @Override
    protected void onPreExecute(){
        super.onPreExecute();
        pd = new ProgressDialog(mContext);
        pd.setProgressStyle(AlertDialog.THEME_HOLO_DARK);
        pd.show(mContext,"Please wait","Sending...");
    }
    protected Boolean doInBackground(String... params) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(params[0]);
        try {
            httpclient.execute(httppost);
            b.set(true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return b.get();
    }
    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        // result holds what you return from doInBackground
        if(pd.isShowing()){
            pd.dismiss();
        }
        Log.i("result from async: ",""+result);
    }
}

这是我收到的错误消息:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference

更新:
我根据这里的答案修复了context问题,并运行了一个测试,使用Thread.sleep()方法模拟了doInBackground方法内部的一些繁重工作,但进度微调器仍然没有显示。有什么想法吗?

更新2:
我设法根据需要显示了进度对话框,但现在我无法取消它。我想这是因为我无法取消UI元素,我需要在runOnUIThread中运行进度对话框吗?

我假设您将活动作为上下文传递,在执行任务时,活动可能已经不存在,您将获得NullPointerException,因此您有2个选项;

  1. 检查上下文-如果它为null,您可能根本不需要加载对话框
  2. 使用应用程序上下文

嗨,请参阅下面更新的AsynTas。

class SmsTask extends AsyncTask<String,Void, Boolean> {
    final AtomicBoolean b = new AtomicBoolean(false);
    private Context mContext;
    private ProgressDialog dialog;
    private SmsTask(Context context){
      this.mContext = context;
    }

    @Override
    protected void onPreExecute(){
        super.onPreExecute();
        Log.i("executing Pre - execute","");
        dialog = new ProgressDialog(mContext );
        dialog.setMessage("Loading...");
        dialog.show();
    }
    protected Boolean doInBackground(String... params) {
        //.... dosing stuff
        return b.get();
    }
    @Override
    protected void onPostExecute(Boolean result) {
        if(dialog.isShowing()){
            dialog.dismiss();
        }
        super.onPostExecute(result);
    }
}
private Context context;

您在这里定义了上下文,但没有初始化它。您可以通过构造函数初始化它

 public SmsTask(Context con){
      context = con;
    }

当您调用SmsTask时,将上下文传递给它。

您需要获取应用程序上下文-dialog = new ProgressDialog(getContext());

最新更新