Android立即在ui线程上运行

时间:2018-12-06 20:49:27

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

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

我的课堂上有一个侦听器,我在异步块中执行了长时间运行的任务:

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

一旦我有了数据,就将其传递回相关的类:

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

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

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

2 个答案:

答案 0 :(得分:2)

确定:

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

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

答案 1 :(得分:0)

几件事:

  1. 如果您的UI线程很忙,您需要等待标题更新,那么您需要重新考虑您的应用设计,找不到找到超越Q的方法。

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

HTH