【问题标题】:Android immediately run on ui threadAndroid 立即在 ui 线程上运行
【发布时间】:2018-12-06 20:49:26
【问题描述】:

我在 StackOverflow 上阅读了很多其他答案,但似乎找不到我的答案。

我的班上有一个监听器,我在异步块中执行一个长时间运行的任务:

AsyncTask.execute(() -> {
   // long running task here
   // ...
   listener.updateTitle(newTitle);
});

获得数据后,我将其传回相关类:

 @Override
 public void updateTitle(String newTitle) {
   getActivity().runOnUiThread(() -> title.setText(newTitle));
 }

现在根据我的在线研究,调用runOnUiThread(..) 将runnable 添加到需要在ui 上运行的任务队列中。我的问题是更新标题比任何其他正在运行的 ui 任务更重要。

是否可以将此任务添加到队列的最前面,或者执行当前正在执行的任务,然后执行此新任务并继续按照之前的顺序执行任务?

【问题讨论】:

    标签: android multithreading runnable android-handler ui-thread


    【解决方案1】:

    当然:

    new Handler(Looper.getMainLooper()).postAtFrontOfQueue(() -> title.setText(newTitle));
    

    这可能不足以满足您的需求,因为无论如何执行此操作都会有一些延迟。如果您需要更新下一帧的标题,您可能需要考虑子类化 TextView 并提供同步方法来设置来自任何线程的文本。

    【讨论】:

    • 您能否对您将如何实现这样的目标进行高级概述?你不会总是需要请求 UI 线程来修改视图吗?
    【解决方案2】:

    几件事:

    1. 如果您的 UI 线程很忙,您需要等待标题更新,您需要重新考虑您的应用设计,而不是找到领先于 Q 的方法。

      李>
    2. 要从 AsynTask 中获取要在 UI 线程中运行的内容,请使用 publishProgress

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 2017-06-12
      • 2020-02-19
      相关资源
      最近更新 更多