При выключении основного потока, как я могу заставить некоторый код выполняться в основном потоке как можно быстрее?

У меня есть пользовательский интерфейс, частично основанный на сети (WebView). Он подключен к пользовательскому интерфейсу Android через интерфейс Javascript. Когда вы нажимаете на элемент в WebView, javascript вызывает Android, а Android получает вызов в javascript/веб-потоке. Не поток пользовательского интерфейса (основной).

Он появляется в Android менее чем за 1 миллисекунду. Нет проблем. Однако, поскольку я хочу изменить пользовательский интерфейс, мне нужно переключиться на поток пользовательского интерфейса. (Android выдает исключение, если вы изменяете пользовательский интерфейс вне основного потока). В настоящее время я использую обработчик в потоке пользовательского интерфейса и вызываю post().

Затем этот код (Runnable) вызывается где-то между 120 и 300 мс позже. Это очень заметное отставание пользовательского интерфейса от прикосновения пользователя.

Есть ли способ ускорить выполнение кода в потоке пользовательского интерфейса? Вот пример кода:

Класс интерфейса:

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();

Спасибо!

7
задан cottonBallPaws 19 March 2012 в 03:54
поделиться