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

前端之家收集整理的这篇文章主要介绍了java – 当关闭主线程时,如何才能尽快在主线程上运行一些代码?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个部分基于Web的用户界面(WebView).它通过 Javascript Interface连接到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.
            }

        });

    }

}

添加到这样的webview:

webview.addJavascriptInterface(new JSInterface(),"AndroidInterface");

像这样的javascript调用

AndroidInterface.test();

谢谢!

解决方法

Is there any way to get some code to run on the UI thread faster?

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

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

>队列有很多积压
>主应用程序线程忙于执行其他一些代码

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

推送来推,使用Handler和postAtFrontOfQueue().但是,正如the JavaDocs for that method所说,这很危险.

猜你在找的Java相关文章