Java 当脱离主线程时,我如何才能让一些代码尽快在主线程上运行?
我有一个部分基于web的用户界面(WebView)。它通过一个网络连接到Android用户界面。当您点击WebView中的某个元素时,javascript将调用Android,Android将通过javascript/web线程接收该调用。不是UI(主)线程 它在1毫秒或更短的时间内到达Android。没问题。但是,因为我现在想更改UI,所以必须切换到UI线程。(如果从主线程外修改UI,Android会引发异常)。我目前正在UI线程上使用处理程序并调用 然后在120到300毫秒之间的任何地方调用此代码(可运行)。这是一个非常明显的滞后,用户界面从用户的触摸改变 有没有办法让一些代码更快地在UI线程上运行?下面是一些示例代码: 接口类:Java 当脱离主线程时,我如何才能让一些代码尽快在主线程上运行?,java,android,multithreading,Java,Android,Multithreading,我有一个部分基于web的用户界面(WebView)。它通过一个网络连接到Android用户界面。当您点击WebView中的某个元素时,javascript将调用Android,Android将通过javascript/web线程接收该调用。不是UI(主)线程 它在1毫秒或更短的时间内到达Android。没问题。但是,因为我现在想更改UI,所以必须切换到UI线程。(如果从主线程外修改UI,Android会引发异常)。我目前正在UI线程上使用处理程序并调用 然后在120到300毫秒之间的任何地方调用
public class JSInterface {
public void test() {
// Arrives here in 1ms after calling AndroidInterface.test(). Arrives n the web thread.
runOnUiThread(new Runnable() {
@Override
public void run() {
// Arrives here 100ms to 300ms after calling AndroidInterface.test(). Arrives on the main (UI) thread.
}
});
}
}
添加到Web视图,如下所示:
webview.addJavascriptInterface(new JSInterface(), "AndroidInterface");
AndroidInterface.test();
在javascript中调用,如下所示:
webview.addJavascriptInterface(new JSInterface(), "AndroidInterface");
AndroidInterface.test();
谢谢
有没有办法让一些代码更快地在UI线程上运行
runOnUiThread()
和kin将消息放在主应用程序线程工作的消息队列中。大多数情况下,主应用程序线程的工作是从队列中提取消息并对其进行处理。但是,主应用程序线程也负责调用大部分回调
如果您看到“120和300毫秒”延迟,这意味着两个并非相互排斥的事情之一:
WebView
、队列和主应用程序线程之间的关系相当神秘,因为WebView
不是用Java代码呈现的经典小部件。因此,我不知道您的Web内容中是否有什么东西可以解释这一点,或者这对于WebView
来说是否相当正常。您可以尝试使用更简单的Web内容进行实验,看看是否会出现类似的延迟,或者延迟是否与您正在呈现的特定Web内容有更密切的关系
推到底,使用
处理程序
和PostAfrontofQueue()
。不过,请注意,这是危险的。作为后续,我使用traceview查看是什么导致线程繁忙。首先,我发现一个自定义视图导致了大量的重绘。解决该问题后,延迟降至120毫秒或更短。其次,handler.post()调用发生在一个长的WebView.nativeDraw()
调用(大约60-70毫秒)过程中,随后是一系列其他绘图调用。因为它发生在调用期间,所以在绘制完成之前,我的代码无法运行。WebView绘图可能是web界面中的按下状态。看来我要去优化绘图了!谢谢另外,需要注意的是,在本例中,postafrontofqueue()
只保存了1或2毫秒,因为在发布时图形已经在进行中。