Возвращение значения из Javascript * надежно * в Webview - PullRequest
1 голос
/ 01 июня 2011

Существует способ вызвать функцию javascript из webview, а затем разрешить ей вызвать метод в 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 завершится»?

1 Ответ

5 голосов
/ 01 июня 2011

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

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();  
}       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...