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!
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
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