我有一個部分基於Web(WebView)的用戶界面。它通過Javascript Interface連接到Android用戶界面。當您點擊WebView中的某個元素時,JavaScript會調用Android,Android會在javascript/web線程上接收該調用。不是UI(主)線程。關閉主線程時,如何獲得一些代碼以儘快在主線程上運行?
它以1毫秒或更短的時間到達Android。那裏沒問題。但是,因爲我想現在更改UI,所以我必須切換到UI線程。 (如果您從主線程修改UI,Android會引發異常)。我目前在UI Thread上使用了一個Handler,並調用post()。
這段代碼(一個Runnable)然後在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.
}
});
}
}
添加到網頁視圖這樣的:
webview.addJavascriptInterface(new JSInterface(), "AndroidInterface");
在JavaScript調用是這樣的:
AndroidInterface.test();
謝謝!
作爲跟進,我使用traceview來查看會導致線程繁忙的原因。首先,我找到了一個導致大量重繪的自定義視圖。解決之後,延遲降低到120ms或更少。其次,handler.post()調用發生在一個長的'WebView.nativeDraw()'調用(約60-70ms)之後,接着是一系列其他繪圖調用。由於它在通話過程中發生,我的代碼在繪製完成之前無法運行。 WebView繪圖可能是Web界面中的按下狀態。所以看起來我正在優化繪圖!謝謝! – cottonBallPaws 2012-03-19 17:48:01
另外,只需注意,在這種情況下,'postAtFrontOfQueue()'只保存1或2ms,因爲繪圖在發佈時已經進行。 – cottonBallPaws 2012-03-19 17:58:22