【发布时间】:2016-12-30 07:36:29
【问题描述】:
我一直在写AsyncTask's for short background operations in android 很长一段时间,并且有一个非常基本的问题。如果我从单独的线程而不是主 UI 线程启动 AsyncTask,我的 onPreExecute()andonPostExecute 方法是否仍会在 UI 线程或我启动 AsyncTask 的线程中调用。我很好奇,因为当我从其他线程启动它时,我无法在 onPreExecute() 方法中显示一个弹出窗口。
编辑 2
I tried writing this simple activity to try:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
final TestAsyncTask task = new TestAsyncTask();
task.execute();
}
}).start();
}
private class TestAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... voids) {
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
Toast.makeText(MainActivity.this, "Yo!", Toast.LENGTH_LONG).show();
}
}
}
这运行良好。 但是当我使用以下代码运行应用程序时:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
final TestAsyncTask task = new TestAsyncTask();
task.execute();
}
}).start();
}
private class TestAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
Toast.makeText(MainActivity.this, "Yo!", Toast.LENGTH_LONG).show();
}
@Override
protected Void doInBackground(Void... voids) {
return null;
}
}
}
它失败并出现以下错误:
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
作为堆栈跟踪中的行之一。
【问题讨论】:
-
在Activity或Class中调用AssynTask?
标签: java android multithreading android-asynctask ui-thread