【发布时间】:2018-12-10 00:10:42
【问题描述】:
我正在使用
AsyncTask.execute(() -> {...}
在我的应用程序中并注意到此方法阻塞了 ui 线程。我在执行主体中有一些代码,它执行一些需要 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));
};
【问题讨论】:
-
不,它本身不会。问题可能出在您的
Runnable方法中。 -
你能分享你的代码吗?
-
@Dimness 更新代码
-
我不熟悉那个库或它的行为,但如果你一个一个地添加太多的项目,并为每个项目调用
notifyItemInserted(),那也会挂起 UI。最好将它们作为一个批次添加,并且只通知一次。此外,每次创建一个新的Handler效率也有点低。 -
好的,谢谢迈克,您提供了很多帮助,我浪费了很多时间来解决这个问题。生病了现在做一个批量更新而不是做一个大队列
标签: android multithreading android-asynctask