2012-03-19 15 views
7

Mam interfejs użytkownika, który jest częściowo oparty na sieci Web (WebView). Jest połączony z interfejsem użytkownika Androida przez Javascript Interface. Po dotknięciu elementu w WebView wywołania javascript do Androida i Androida otrzymują wywołanie w wątku javascript/web. Nie wątek interfejsu użytkownika (główny).Kiedy wyłączyć główny wątek, jak mogę jak najszybciej uruchomić kod główny wątku?

Pojawia się w systemie Android w ciągu 1 lub mniej milisekund. Nie ma problemu. Jednakże, ponieważ chcę teraz zmienić interfejs użytkownika, muszę przełączyć się na wątek interfejsu użytkownika. (Android zgłasza wyjątek, jeśli modyfikujesz interfejs z poza głównym wątkiem). Obecnie używam programu obsługi na wątku interfejsu użytkownika i wywołanie post().

Ten kod (Runnable) jest następnie wywoływany w dowolnym miejscu między 120 a 300 ms później. Jest to bardzo zauważalne opóźnienie w zmianie interfejsu użytkownika po dotknięciu użytkownika.

Czy istnieje sposób na szybsze uruchomienie kodu na wątku interfejsu użytkownika? Oto przykładowy kod: class

Interfejs:

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. 
      } 

     }); 

    } 

} 

Dodano do WebView tak:

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

Powołani w javascript tak:

AndroidInterface.test(); 

Dzięki!

Odpowiedz

6

Czy istnieje sposób na szybsze uruchomienie kodu na wątku interfejsu użytkownika?

runOnUiThread() i kin umieścić wiadomość w kolejce wiadomości, że główny wątek aplikacji działa. W większości przypadków głównym zadaniem wątku aplikacji jest wyciągnięcie komunikatu z kolejki i przetworzenie go. Jednak główny wątek aplikacji jest również odpowiedzialny za wywoływanie większości twoich wywołań zwrotnych.

Jeśli widzisz „120 i 300 ms” opóźnień, co oznacza, że ​​jeden z dwóch nie-wzajemnie wykluczających się rzeczy:

  1. Kolejka ma dość zaległości

  2. Główny wątek aplikacji zajęty wykonania inny kod

zależność pomiędzy WebView kolejka, a główny gwint stosowanie raczej tajemnicza Compar ed do normalnych widżetów, ponieważ WebView nie jest klasycznym widgetem renderowanym w kodzie Java. W związku z tym nie mam pojęcia, czy jest coś, co występuje w treści WWW, które może to wyjaśnić, lub jeśli jest to dość normalne dla WebView. Możesz spróbować eksperymentu z prostszą treścią sieci Web i sprawdzić, czy występują podobne opóźnienia lub czy opóźnienia są w jakiś sposób bardziej związane z konkretną treścią WWW, którą renderujesz.

Naciśnij, aby przesunąć, użyj Handler i postAtFrontOfQueue(). Jednak jako uwaga the JavaDocs for that method jest to niebezpieczne.

+0

Jako kontynuację, użyłem traceview, aby zobaczyć, co spowoduje, że wątek będzie zajęty. Po pierwsze, znalazłem niestandardowy widok, który powodował wiele przerysowań.Po rozwiązaniu tego opóźnienie spadło do 120 ms lub mniej. Po drugie, wywołanie handler.post() następuje podczas długiego wywołania 'WebView.nativeDraw()' (około 60-70ms), po którym następuje seria innych wywołań rysowania. Ponieważ zdarza się to podczas połączenia, mój kod nie może być uruchomiony do czasu zakończenia losowania. Losowanie WebView jest prawdopodobnie wciśniętym stanem w interfejsie internetowym. Wygląda więc na to, że zaczynam optymalizować rysunek! Dzięki! – cottonBallPaws

+0

Należy również zauważyć, że w tym przypadku 'postAtFrontOfQueue()' zapisało tylko 1 lub 2 ms, ponieważ rysunek był już w toku, kiedy został opublikowany. – cottonBallPaws

Powiązane problemy