我在 WebView 中调用 JavaScript 函数并在应用程序中获取响应(在我的 Galaxy Tab 2 '10 上)时遇到一些问题。我在内容加载后直接调用 js 函数。根据这一个解决方案 https://stackoverflow.com/a/4945875/968702我用一个PictureListener
webView.setPictureListener(new PictureListener() {
@Override
public void onNewPicture(WebView view, Picture picture) {
webView.loadUrl("javascript: JsImpl.init('{response}');");
}
});
它工作正常:加载内容时, onNewPicture 始终启动。"javascript: JsImpl.init('{response}')
加载调用的js:
class JsImpl {
private final static String LOG_TAG = "JsImpl";
@JavascriptInterface
public void init(String json) {
Log.d(LOG_TAG, json);
}
}
在日志中我看到D/JsImpl(18400): {response}
。似乎一切都好,但是……
当我在横向或纵向模式下切换选项卡时WebView
被重新创建,onNewPicture
已启动,但方法public void init(String json)
in the JsImpl
通常根本不被调用!
所以如果我改变方向,js有时会起作用,有时则不起作用。没有异常,没有错误...
谁面临同样的问题?
下面是完整代码
public class NextActivity extends Activity {
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
final WebView wv = (WebView) findViewById(R.id.WebView);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl("file:///android_asset/index.html");
wv.addJavascriptInterface(new JsImpl(), "JsImpl");
wv.setPictureListener(new PictureListener() {
@Override
public void onNewPicture(WebView view, Picture picture) {
wv.loadUrl("javascript: JsImpl.init('{responce}');");
}
});
}
class JsImpl {
private final static String LOG_TAG = "JsImpl";
@JavascriptInterface
public void init(String json) {
Log.d(LOG_TAG, json);
}
}
}
这里不需要 html 代码,只需在 asset 目录中放置一个空的 html 文件即可index.html
.
EDIT:我找到了一种解决方案,但我不知道它到底是正确的版本。但它有效。
我添加了处理程序循环
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (isJSSetup) return;
Log.i("handler-loop", "JS didn't handle. Reload page");
wv.loadUrl(CONTENT_PAGE);
handler.postDelayed(this, 1000);
}
}, 1000);
当 @JavascriptInterface init(String json) 被调用时,isJSSetup
became true
。在处理程序循环中,我检查 JS 是否已设置if (isJSSetup) return;
。如果没有 - 我再次重新加载 URL wv.loadUrl(CONTENT_PAGE) 并尝试调用 init(String json)。只要它不起作用。它是硬编码的,所以我仍在寻找一个好的解决方案。