异步执行块ui线程吗?

时间:2018-12-10 00:10:42

标签: android multithreading android-asynctask

我正在使用

AsyncTask.execute(() -> {...} 

在我的应用程序中,并注意到此方法阻塞了ui线程。我在execute主体中包含一些代码,这些代码需要进行5到8秒的计算,然后通过runOnUiThread将结果返回到ui。但是看起来就像一旦我调用了其中包含Async.execute(..)的方法。在该元素完成其计算并将结果返回给ui之前,禁止该UI添加其他元素。

Android文档也指出:

  

必须从应用程序的主线程调用此方法。

Link to docs

所以我的问题是,异步执行会阻塞ui线程吗?我的观察是真的。

谢谢

编辑

我正在使用this library抓取TMDB数据

 AsyncTask.execute(() -> {

            TmdbTvSeasons tmdbTvSeasons = new TmdbApi(apiKey).getTvSeasons();
            TvSeason season = tmdbTvSeasons.getSeason(
                    tmdbShowId,
                    seasonNumber,
                    "en",
                    TmdbTvSeasons.SeasonMethod.videos);

            listener.tvSeasonReceived(season);

        });

然后我的侦听器将结果传递到ui以更新回收者视图:

 tListener = t -> {
                tArray.add(t)
                jobHandler = new Handler(Looper.getMainLooper());
                jobHandler.post(() ->
                        adapter.notifyItemInserted(tArray.size() - 1));
            };

1 个答案:

答案 0 :(得分:0)

AsyncTask.execute在AsyncTask线程上运行。只要您不调用.get()(您永远都不要这样做)异步。但是,您不需要使用runOnUiThread或将其发布到Handler-AsyncTask的全部要点是onPostExecute在UI线程上运行-否则,您只需使用Thread。