Android - 在使用AsyncTask时显示\解除进度对话框的麻烦

时间:2015-04-05 13:21:15

标签: android android-asynctask progressdialog

我正在使用AsyncTask发出网址请求,并希望在处理请求时显示某种进度微调器。 AsyncTask类位于另一个扩展VerificationActivity的活动Activity中。应用程序在此行崩溃: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问题,并运行了一个测试,使用doInBackground方法在Thread.sleep()方法中模拟了一些繁重的工作,但进度微调器仍未显示。有任何想法吗?

UPDATE2:
我设法显示我需要的进度对话框,但现在我无法解雇它。我认为这是因为我无法解除UI元素,我是否需要在runOnUIThread内运行进度对话框?

4 个答案:

答案 0 :(得分:1)

我假设您将活动作为上下文传递,并且当任务执行时,活动可能会消失,您将获得NullPointerException,因此您有2个选项;

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

答案 1 :(得分:0)

嗨,请参阅下面更新的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);
    }
}

答案 2 :(得分:0)

private Context context;

您已在此处定义了上下文,但未对其进行初始化。您可以通过构造函数

对其进行初始化
 public SmsTask(Context con){
      context = con;
    }

当你调用SmsTask传递上下文时。

答案 3 :(得分:0)

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