我遇到了AsyncTask和onPostExecute的问题.我发现onPostExecute正在与主ui线程不同的线程上执行,这导致在修改任何视图时发生CalledFromWrongThreadException.
我进行了一些日志记录,以查看运行onPreExecute,doInBackground和onPostExecute的线程.我会看到这样的结果......
onPreExecute ThreadId: 1
doInBackground ThreadId: 25
onPostExecute ThreadId: 18
Run Code Online (Sandbox Code Playgroud)
我相信主ui线程id是1,我希望onPre和onPost都在线程1上执行.我确保创建并从ui线程调用execute方法(例如在Activity的onCreate中).
另外需要注意的是,我注意到以后的异步任务将在与先前异步任务onPostExecute方法相同的线程上运行其onPostExecute方法(在本例中为线程18).
现在,为了解决这个问题,我在调用runOnUiThread时将代码包装在我的onPostExecute方法中,但我认为这很麻烦,并且想要解决真正的问题.
我没有想法!任何人有任何见解?我很乐意回答任何可以帮助进一步调查的问题!
编辑:
有两种方法可以在代码中运行异步任务.我想知道这些例子中的后者是否会导致一些奇怪的事情发生?
public class SomeActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
new SomeAsyncTask().execute();
}
private class SomeAsyncTask extends AsyncTask<String, Void, Integer> {
@Override
public void onPreExecute() {
Thread.currentThread().getId() // 1
//Show a dialog
}
@Override
public Integer doInBackground(String... params) {
Thread.currentThread().getId() // 25
return 0;
}
@Override
public void onPostExecute(Integer result) {
Thread.currentThread().getId() // 18
//hide dialog
//update text view …Run Code Online (Sandbox Code Playgroud) 在阅读AsyncTask文档,关于线程规则的部分时,我发现了这个:
- 必须在UI线程上加载AsyncTask类.这是从JELLY_BEAN开始自动完成的.
- 必须在UI线程上创建任务实例.
- 必须在UI线程上调用execute(Params ...).
"装载"是什么意思?它没有实例化或执行,因为文档稍后讨论了这些.