To jest cały kod Java, którego użyłem. Wyjaśnię bardziej szczegółowo poniżej ...JavaScriptInterface w Androidzie WebView: wiele połączeń z JS powoduje impas
public class Test7 extends Activity {
//debug
private final static String TAG = "JSInterface";
private WebView wv;
private class JSInterface {
private WebView wv;
// Variables to manage interfacing with JS
private String returnValue;
private boolean canReadReturnValue;
private Lock lockOnJS;
private Condition condVarOnJS;
public JSInterface (WebView wv) {
this.wv = wv;
this.canReadReturnValue = false;
this.lockOnJS = new ReentrantLock();
this.condVarOnJS = lockOnJS.newCondition();
}
public void setReturnValue(String ret) {
lockOnJS.lock();
returnValue = ret;
canReadReturnValue = true;
condVarOnJS.signal();
lockOnJS.unlock();
Log.d(TAG, "returnValue = " + returnValue);
}
public String getReturnValue() {
Log.d(TAG, "enter in getReturnValue");
lockOnJS.lock();
while (!canReadReturnValue) {
try {
Log.d(TAG, "get wait...");
condVarOnJS.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lockOnJS.unlock();
Log.d(TAG, "returnValue: " + returnValue);
return returnValue;
}
public String getNewString() {
wv.loadUrl("javascript:JSInterface.setReturnValue(createNewString())");
return getReturnValue();
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
wv = (WebView) findViewById(R.id.webView1);
wv.getSettings().setJavaScriptEnabled(true);
wv.addJavascriptInterface(new JSInterface(wv), "JSInterface");
wv.loadUrl("file:///android_asset/prova7.html");
}
public void button1(View v) {
wv.loadUrl("javascript:func('1')");
}
}
Wygląda na to, że działa dobrze.
Widać, że mam przycisku (który możemy nazwać button1) i kliknięcie na niego, próbuje wykonać metodę JS, zwany func().
public void button1(View v) {
wv.loadUrl("javascript:func('1')");
}
Wewnątrz tej metody JS, muszę wywołać inną metodę Java. Jest to kod:
function func(id) {
document.getElementById(id).innerHTML = JSInterface.getNewString();
}
muszę zwrócić wynik JSInterface.getNewString() do zmiennej innerHTML.
Kodeks JSInterface.getNewString() to:
public String getNewString() {
wv.loadUrl("javascript:JSInterface.setReturnValue(createNewString())");
return getReturnValue();
}
Można zobaczyć, że użycie metody setReturnValue
i getReturnValue
do zwrotu wartości zwracanych inną metodą JS. Jest to kod:
function createNewString() {
return "my New String";
}
Problemem jest to, że gdy próbuję ustawić returnValue The createNewString funkcja jest nigdy wykonywany! Jeśli dodaję linię console.log(), mój logCat nic nie wyświetla!
Nie mogę zrozumieć, dlaczego tak się dzieje.
Nie, to nie działa –