【问题标题】:Does Async execute block ui thread?异步执行是否会阻塞 ui 线程?
【发布时间】:2018-12-10 00:10:42
【问题描述】:

我正在使用

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

在我的应用程序中并注意到此方法阻塞了 ui 线程。我在执行主体中有一些代码,它执行一些需要 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));
            };

【问题讨论】:

  • 不,它本身不会。问题可能出在您的 Runnable 方法中。
  • 你能分享你的代码吗?
  • @Dimness 更新代码
  • 我不熟悉那个库或它的行为,但如果你一个一个地添加太多的项目,并为每个项目调用notifyItemInserted(),那也会挂起 UI。最好将它们作为一个批次添加,并且只通知一次。此外,每次创建一个新的Handler 效率也有点低。
  • 好的,谢谢迈克,您提供了很多帮助,我浪费了很多时间来解决这个问题。生病了现在做一个批量更新而不是做一个大队列

标签: android multithreading android-asynctask


【解决方案1】:

AsyncTask.execute 在 AsyncTask 线程上运行。只要你不调用 .get() (你不应该这样做)它是异步的。但是,您不需要使用 runOnUiThread 或使用它发布到处理程序 - AsyncTask 的全部意义在于 onPostExecute 在 UI 线程上运行 - 否则您只需使用线程。

【讨论】:

    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    相关资源
    最近更新 更多