我有一个部分基于Web(WebView)的用户界面。它通过Javascript Interface连接到Android用户界面。当您点击WebView中的某个元素时,JavaScript会调用Android,Android会在javascript/web线程上接收该调用。不是UI(主)线程。关闭主线程时,如何获得一些代码以尽快在主线程上运行?
它以1毫秒或更短的时间到达Android。那里没问题。但是,因为我想现在更改UI,所以我必须切换到UI线程。 (如果您从主线程修改UI,Android会引发异常)。我目前在UI Thread上使用了一个Handler,并调用post()。
这段代码(一个Runnable)然后在120到300毫秒之后的任何地方被调用。这是用户界面从用户触摸改变的非常明显的滞后。
有什么办法让一些代码更快地在UI线程上运行?下面是一些示例代码:
接口类:
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.
}
});
}
}
添加到网页视图这样的:
webview.addJavascriptInterface(new JSInterface(), "AndroidInterface");
在JavaScript调用是这样的:
AndroidInterface.test();
谢谢!
作为跟进,我使用traceview来查看会导致线程繁忙的原因。首先,我找到了一个导致大量重绘的自定义视图。解决之后,延迟降低到120ms或更少。其次,handler.post()调用发生在一个长的'WebView.nativeDraw()'调用(约60-70ms)之后,接着是一系列其他绘图调用。由于它在通话过程中发生,我的代码在绘制完成之前无法运行。 WebView绘图可能是Web界面中的按下状态。所以看起来我正在优化绘图!谢谢! – cottonBallPaws 2012-03-19 17:48:01
另外,只需注意,在这种情况下,'postAtFrontOfQueue()'只保存1或2ms,因为绘图在发布时已经进行。 – cottonBallPaws 2012-03-19 17:58:22