Possiedo un'interfaccia utente parzialmente basata sul Web (WebView). È collegato all'interfaccia utente Android tramite un Javascript Interface. Quando si tocca un elemento in WebView, javascript chiama ad Android e Android riceve la chiamata sul thread javascript/web. Non il thread UI (principale).Quando si è fuori dal thread principale, come posso far funzionare un po 'di codice sul thread principale il più velocemente possibile?
Arriva in Android in 1 o meno millisecondi. Nessun problema lì. Tuttavia, poiché ora voglio cambiare l'interfaccia utente, devo passare al thread dell'interfaccia utente. (Android genera un'eccezione se modifichi l'interfaccia utente dal thread principale). Attualmente sto usando un gestore sul thread UI e chiamando post().
Questo codice (a Runnable) viene quindi chiamato ovunque tra 120 e 300 ms in seguito. Questo è un ritardo molto evidente per l'interfaccia utente per cambiare dal tocco dell'utente.
C'è un modo per ottenere un po 'di codice per l'esecuzione sul thread dell'interfaccia utente più veloce? Ecco qualche esempio di codice: class
Un'interfaccia:
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.
}
});
}
}
aggiunta ad un WebView come questo:
webview.addJavascriptInterface(new JSInterface(), "AndroidInterface");
Chiamato in javascript come questo:
AndroidInterface.test();
Grazie!
Come follow-up, ho utilizzato la visualizzazione rapida per vedere cosa causerebbe il thread essere occupato. Innanzitutto, ho trovato una visualizzazione personalizzata che stava causando molti ritocchi.Dopo averlo risolto, il ritardo è sceso a 120 ms o meno. In secondo luogo, la chiamata handler.post() si verifica durante una lunga chiamata 'WebView.nativeDraw()' (circa 60-70ms) seguita da una serie di altre chiamate di disegno. Dal momento che accade durante la chiamata, il mio codice non può essere eseguito fino a quando non vengono eseguiti i disegni. Il disegno WebView è probabilmente lo stato premuto nell'interfaccia web. Quindi sembra che io vada per ottimizzare il disegno! Grazie! – cottonBallPaws
Inoltre, solo per notare, in questo caso 'postAtFrontOfQueue()' ha salvato solo 1 o 2 ms, poiché il disegno era già in corso al momento della pubblicazione. – cottonBallPaws