我正在使用
AsyncTask.execute(() -> {...}
在我的应用程序中,并注意到此方法阻塞了ui线程。我在execute主体中包含一些代码,这些代码需要进行5到8秒的计算,然后通过runOnUiThread
将结果返回到ui。但是看起来就像一旦我调用了其中包含Async.execute(..)的方法。在该元素完成其计算并将结果返回给ui之前,禁止该UI添加其他元素。
Android文档也指出:
必须从应用程序的主线程调用此方法。
所以我的问题是,异步执行会阻塞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));
};
答案 0 :(得分:0)
AsyncTask.execute在AsyncTask线程上运行。只要您不调用.get()(您永远都不要这样做)异步。但是,您不需要使用runOnUiThread或将其发布到Handler-AsyncTask的全部要点是onPostExecute在UI线程上运行-否则,您只需使用Thread。