相关疑难解决方法(0)

关于主ui线程的Android AsyncTask onPostExecute

我遇到了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)

multithreading android android-asynctask

7
推荐指数
1
解决办法
7462
查看次数

在UI线程上加载和创建AsyncTask有什么区别?

在阅读AsyncTask文档,关于线程规则的部分时,我发现了这个:

  • 必须在UI线程上加载AsyncTask类.这是从JELLY_BEAN开始自动完成的.
  • 必须在UI线程上创建任务实例.
  • 必须在UI线程上调用execute(Params ...).

"装载"是什么意思?它没有实例化或执行,因为文档稍后讨论了这些.

android android-asynctask

3
推荐指数
1
解决办法
1054
查看次数