Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当脱离主线程时,我如何才能让一些代码尽快在主线程上运行?_Java_Android_Multithreading - Fatal编程技术网

Java 当脱离主线程时,我如何才能让一些代码尽快在主线程上运行?

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毫秒之间的任何地方调用

我有一个部分基于web的用户界面(WebView)。它通过一个网络连接到Android用户界面。当您点击WebView中的某个元素时,javascript将调用Android,Android将通过javascript/web线程接收该调用。不是UI(主)线程

它在1毫秒或更短的时间内到达Android。没问题。但是,因为我现在想更改UI,所以必须切换到UI线程。(如果从主线程外修改UI,Android会引发异常)。我目前正在UI线程上使用处理程序并调用

然后在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.
            }

        });

    }

}
添加到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毫秒,因为在发布时图形已经在进行中。