我有一个部分基于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所说,这很危险.