2012-03-19 67 views
7

我有一个部分基于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(); 

谢谢!

回答

6

有什么办法让一些代码更快地在UI线程上运行?

runOnUiThread()和亲将消息放在消息队列中,主应用程序线程的工作。很多时候,主应用程序线程的工作就是从队列中取出一条消息并对其进行处理。但是,主应用程序线程也负责调用大部分回调函数。

如果您看到“120个300毫秒”延迟,这意味着两个不相互排斥的事情之一:

  1. 队列中有相当的积压

  2. 主应用程序线程正忙于执行一些其他的代码

WebView之间的队列和主应用程序线程的关系,是相当神秘,COMPAR编辑到正常的小部件,因为WebView不是在Java代码中呈现的经典小部件。因此,我不知道您的Web内容中是否存在可能会解释这种情况的内容,或者对于WebView这是非常正常的情况。您可以尝试使用更简单的Web内容进行实验,看看您是否得到类似的延迟,或者延迟是否与您呈现的特定Web内容紧密相关。

推动来推,使用HandlerpostAtFrontOfQueue()。正如the JavaDocs for that method注意,但这是危险的。

+0

作为跟进,我使用traceview来查看会导致线程繁忙的原因。首先,我找到了一个导致大量重绘的自定义视图。解决之后,延迟降低到120ms或更少。其次,handler.post()调用发生在一个长的'WebView.nativeDraw()'调用(约60-70ms)之后,接着是一系列其他绘图调用。由于它在通话过程中发生,我的代码在绘制完成之前无法运行。 WebView绘图可能是Web界面中的按下状态。所以看起来我正在优化绘图!谢谢! – cottonBallPaws 2012-03-19 17:48:01

+0

另外,只需注意,在这种情况下,'postAtFrontOfQueue()'只保存1或2ms,因为绘图在发布时已经进行。 – cottonBallPaws 2012-03-19 17:58:22

相关问题