Este es el código completo de Java que he usado. Voy a explicar en más detalle a continuación ...JavaScriptInterface en Android WebView: llamadas múltiples a JS causan un punto muerto
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')");
}
}
Y parece que funciona bien.
Se puede ver que tengo un botón (que podemos llamar botón1), y haciendo clic en él, se trata de ejecutar un método JS, llamados func().
public void button1(View v) {
wv.loadUrl("javascript:func('1')");
}
Dentro de este método de JS, tengo que llamar a otro método de Java. Este es el código:
function func(id) {
document.getElementById(id).innerHTML = JSInterface.getNewString();
}
necesito devolver el resultado de JSInterface.getNewString() a la variable innerHTML.
El código de JSInterface.getNewString() es la siguiente:
public String getNewString() {
wv.loadUrl("javascript:JSInterface.setReturnValue(createNewString())");
return getReturnValue();
}
Se puede ver que utilizo el método setReturnValue
y getReturnValue
para devolver el valor devuelto por otro método JS. Este es el código:
function createNewString() {
return "my New String";
}
El problema es que cuando intento configurar el returnValue, la createNewString función no se ejecuta nunca! Si agrego una línea console.log(), ¡mi logCat no muestra nada!
No puedo entender por qué sucede esto.
No, no funciona –