使用AsyncTask执行线程时,ProgressDialog不会出现

时间:2017-01-29 06:43:48

标签: android multithreading android-asynctask

我是Android编程的新手,所以我希望你能帮助我。我有AsyncTask通过OnClickListener事件执行,doInBackground()方法内部是Thread,它没有在UI线程上运行。

AsyncTask通过OnClickListener执行:

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    new MyAsyncTask().execute();
  }
});

AsyncTaskMainActivity的子类:

private class MyAsyncTask extends AsyncTask<Void, Void, Void> {

  ProgressDialog progress;

  @Override
  protected void onPreExecute() {
    // Show ProgressDialog before the task starts.
    progress = new ProgressDialog(MainActivity.this);
    progress.setMessage("Running...");
    progress.setCancelable(false);
    progress.show();
  }

  @Override
  protected Void doInBackground(Void... params) {
    // Since the thread is not running on the UI thread,
    // I have to use the runOnUiThread() method so the
    // app won't crash when the thread is complete.
    runOnUiThread(new Runnable() {
      @Override
      public void run() {
        try {
          new ThreadFromOtherClass(arg1, arg2);
        } catch (Exception e) {
          Log.e("Exception", "Something happened.", e);
        }
      }
    });
    return null;
  }

  @Override
  protected void onPostExecute(Void aVoid) {
    // Hide the dialog when the task ends.
    progress.dismiss();
  }
}

我在运行Thread时没有遇到任何问题,但ProgressDialog在任务执行期间没有显示。但是,如果我排除runOnUiThread()方法,则会显示对话框,但是当Thread完成时应用程序崩溃。知道我做错了吗?

2 个答案:

答案 0 :(得分:1)

  

ProgressDialog不会出现

创建MyAsyncTask的构造函数并传递Context的{​​{1}}:

MainActivty

在onClick内部:

private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
Context context;

public MyAsyncTask(Context context){
  context.this = context;
}

  ProgressDialog progress;

  @Override
  protected void onPreExecute() {
    // Show ProgressDialog before the task starts.
    progress = new ProgressDialog(context);
    progress.setMessage("Running...");
    progress.setCancelable(false);
    progress.show();
  }

答案 1 :(得分:0)

您的代码正常运行。问题在于,你实际上是从doInBackground()方法内部开始另一个线程(我认为无论出于何种原因,我认为这不是一个好主意。)

第二个线程启动后,您将收到onPostExecute()的回调。即使&#34;第二&#34;线程可能有很多工作要做,你的MyAsyncTask并没有等待它完成。

所以,实际上,你的对话框显示和解除得如此之快,以至于你在屏幕上没有注意到它。