Возвращение значения из Javascript *надежно* в Webview

Существует способ вызвать функцию javascript из веб-просмотра, а затем позволить ей вызвать метод в Java для возврата результата. Как описано в Как получить возвращаемое значение из javascript в веб-просмотре Android?

Теперь функция javascript может дать сбой (скажем, из-за опечатки в файле javascript). В этом случае я хотел бы выполнить некоторый код аварийного переключения на Java. Как это сделать?

Мой текущий код выглядит так:

В Java:

    private boolean eventHandled = false;
    @Override
    public void onEvent() {
        eventHandled = false;
        webview.loadUrl("javascript:handleEvent()");

        // Wait for JS to handle the event.
        try {
            Thread.sleep(500);  // milliseconds
        } catch (InterruptedException e) {
            // log
        }   

        if (!eventHandled) {
            // run failover code here.
        }   
    }   
    public final MyActivity activity = this;
    public class EventManager {
        // This annotation is required in Jelly Bean and later:
        @JavascriptInterface
        public void setEventHandled() {
            eventHandled = true;
        }   
    };  

webview.addJavascriptInterface(new EventManager(), "eventManager");

В JavaScript:

function handleEvent() {
    var success =  doSomething();
    if (success) {
        eventManager.setEventHandled();
    }   
}

Это, кажется, отлично работает для моего случая. Есть ли лучший способ, чем этот метод «спать какое-то время и надеяться, что вызов Javascript будет завершен к тому времени»?


person tarkeshwar    schedule 01.06.2011    source источник


Ответы (1)


Вы можете использовать объект синхронизации для уведомления и ожидания:

public class EventManager {
    private final ConditionVariable eventHandled = new ConditionVariable();     

    public void setEventHandled() {
        eventHandled.open();
    }

    void waitForEvent() {
        eventHandled.block();
    }
}

private final EventManager eventManager = new EventManager();

@Override
public void onEvent() {
    webview.loadUrl("javascript:handleEvent()");

    // Wait for JS to handle the event.
    eventManager.waitForEvent();  
}       
person Michael    schedule 01.06.2011
comment
Если функция javascript дает сбой и setEventHandled() не вызывается, я хочу запустить некоторый код отработки отказа (как показано в вопросе). Этот ответ просто заблокирует ожидание успешного вызова javascript, нет? - person tarkeshwar; 01.06.2011
comment
Используйте метод block с тайм-аутом. - person Michael; 01.06.2011