2012-03-19 66 views
7

我有一個部分基於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(); 

謝謝!

回答

6

有什麼辦法讓一些代碼更快地在UI線程上運行?

runOnUiThread()和親將消息放在消息隊列中,主應用程序線程的工作。很多時候,主應用程序線程的工作就是從隊列中取出一條消息並對其進行處理。但是,主應用程序線程也負責調用大部分回調函數。

如果您看到「120個300毫秒」延遲,這意味着兩個不相互排斥的事情之一:

  1. 隊列中有相當的積壓

  2. 主應用程序線程正忙於執行一些其他的代碼

WebView之間的隊列和主應用程序線程的關係,是相當神祕,COMPAR編輯到正常的小部件,因爲WebView不是在Java代碼中呈現的經典小部件。因此,我不知道您的Web內容中是否存在可能會解釋這種情況的內容,或者對於WebView這是非常正常的情況。您可以嘗試使用更簡單的Web內容進行實驗,看看您是否得到類似的延遲,或者延遲是否與您呈現的特定Web內容緊密相關。

推動來推,使用HandlerpostAtFrontOfQueue()。正如the JavaDocs for that method注意,但這是危險的。

+0

作爲跟進,我使用traceview來查看會導致線程繁忙的原因。首先,我找到了一個導致大量重繪的自定義視圖。解決之後,延遲降低到120ms或更少。其次,handler.post()調用發生在一個長的'WebView.nativeDraw()'調用(約60-70ms)之後,接着是一系列其他繪圖調用。由於它在通話過程中發生,我的代碼在繪製完成之前無法運行。 WebView繪圖可能是Web界面中的按下狀態。所以看起來我正在優化繪圖!謝謝! – cottonBallPaws 2012-03-19 17:48:01

+0

另外,只需注意,在這種情況下,'postAtFrontOfQueue()'只保存1或2ms,因爲繪圖在發佈時已經進行。 – cottonBallPaws 2012-03-19 17:58:22

相關問題