我是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();
}
});
AsyncTask
是MainActivity
的子类:
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
完成时应用程序崩溃。知道我做错了吗?
答案 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
并没有等待它完成。
所以,实际上,你的对话框显示和解除得如此之快,以至于你在屏幕上没有注意到它。