当关闭主线程时,如何尽快获得一些代码才能在主线程上运行?

cot*_*aws 7 java multithreading android

我有一个部分基于Web的用户界面(WebView).它通过Javascript接口连接到Android UI .当您点击WebView中的元素时,javascript会调用Android,Android会在javascript/web线程上接收调用.不是UI(主)线程.

它以1毫秒或更短的时间到达Android.没问题.但是,因为我现在要更改UI,所以我必须切换到UI线程.(如果从主线程修改UI,Android会抛出异常).我目前在UI线程上使用Handler并调用post().

然后在120到300毫秒之后的任何地方调用此代码(Runnable).这是UI从用户的触摸中改变的非常明显的延迟.

有没有办法让一些代码更快地在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.
            }

        });

    }

}
Run Code Online (Sandbox Code Playgroud)

添加到这样的webview:

webview.addJavascriptInterface(new JSInterface(), "AndroidInterface");
Run Code Online (Sandbox Code Playgroud)

像这样的javascript调用:

AndroidInterface.test();
Run Code Online (Sandbox Code Playgroud)

谢谢!

Com*_*are 6

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

runOnUiThread()和亲在主应用程序线程工作的消息队列上放置一条消息.大多数情况下,主应用程序线程的工作是从队列中提取消息并处理它.但是,主应用程序线程也负责调用大多数回调.

如果您看到"120和300毫秒"延迟,这意味着两个不相互排斥的东西之一:

  1. 队列有很多积压

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

WebView与普通小部件相比,队列和主应用程序线程之间的关系相当神秘,因为WebView它不是用Java代码呈现的经典小部件.因此,我不知道您的Web内容中是否存在可能解释此问题的内容,或者这是否相当正常WebView.您可以尝试使用更简单的Web内容进行实验,看看是否会出现类似的延迟,或者延迟是否与您正在呈现的特定Web内容更加紧密相关.

推来推,使用HandlerpostAtFrontOfQueue().但是,正如该方法的JavaDocs所说,这很危险.