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)
谢谢!
有没有办法让一些代码更快地在UI线程上运行?
runOnUiThread()和亲在主应用程序线程工作的消息队列上放置一条消息.大多数情况下,主应用程序线程的工作是从队列中提取消息并处理它.但是,主应用程序线程也负责调用大多数回调.
如果您看到"120和300毫秒"延迟,这意味着两个不相互排斥的东西之一:
队列有很多积压
主应用程序线程忙于执行其他一些代码
WebView与普通小部件相比,队列和主应用程序线程之间的关系相当神秘,因为WebView它不是用Java代码呈现的经典小部件.因此,我不知道您的Web内容中是否存在可能解释此问题的内容,或者这是否相当正常WebView.您可以尝试使用更简单的Web内容进行实验,看看是否会出现类似的延迟,或者延迟是否与您正在呈现的特定Web内容更加紧密相关.
推来推,使用Handler和postAtFrontOfQueue().但是,正如该方法的JavaDocs所说,这很危险.
| 归档时间: |
|
| 查看次数: |
1536 次 |
| 最近记录: |