Đây là toàn bộ mã Java tôi đã sử dụng. Tôi sẽ giải thích chi tiết hơn bên dưới ...JavascriptInterface trong WebView của Android: nhiều cuộc gọi tới JS gây ra bế tắc
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')");
}
}
Và có vẻ như nó hoạt động tốt.
Bạn có thể thấy rằng tôi đã có một nút (mà chúng ta có thể gọi button1), và nhấp vào nó, nó sẽ cố gắng để thực hiện một phương pháp JS, gọi func().
public void button1(View v) {
wv.loadUrl("javascript:func('1')");
}
Bên trong phương thức JS này, tôi phải gọi một phương thức Java khác. Đây là mã:
function func(id) {
document.getElementById(id).innerHTML = JSInterface.getNewString();
}
Tôi cần trả lại kết quả của JSInterface.getNewString() vào biến innerHTML.
Mã của JSInterface.getNewString() là thế này:
public String getNewString() {
wv.loadUrl("javascript:JSInterface.setReturnValue(createNewString())");
return getReturnValue();
}
Bạn có thể thấy rằng tôi sử dụng phương pháp setReturnValue
và getReturnValue
để trả về giá trị trả về bởi phương pháp JS khác. Đây là mã:
function createNewString() {
return "my New String";
}
Vấn đề là khi tôi cố gắng đặt returnValue, hàm createNewString sẽ không bao giờ được thực thi! Nếu tôi thêm một dòng console.log(), logCat của tôi sẽ không hiển thị gì cả!
Tôi không thể hiểu tại sao điều này xảy ra.
Không, nó không hoạt động –