【发布时间】:2016-06-24 20:54:28
【问题描述】:
我有一个与此问题相同的错误的崩溃报告:WebView methods on same thread error
这里建议创建一个 Runnable()。
我不明白为什么这能解决问题。错误显示“同一线程上的 Webview 方法”,但答案建议在 UI 线程(主线程)上创建方法。但是 UI-Thread 不是唯一的线程吗?有人可以详细解释整个过程吗(考虑到我在构造函数的每个活动中都创建了一个新的 Webview)?
我实现 Javascript 函数/方法的代码如下所示:
public class JS_Bind {
private static final String TAG = "JS_Bind";
private Context context;
private AdvancedWebView mWebView;
public JS_Bind(Context c, AdvancedWebView mWebView) {
context = c;
this.mWebView = mWebView;
}
@JavascriptInterface
public void openActivity(String activityName) {
try {
Class activityClass = Class.forName(PACKAGE_NAME + "." + activityName);
context.startActivity(new Intent(MainActivity.this, activityClass));
} catch (ClassNotFoundException e) {
Toast.makeText(context, "Invalid activity name: " + activityName, Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
@JavascriptInterface
public void makeToast(String toast) {
Toast mToast = Toast.makeText(context, toast, Toast.LENGTH_SHORT);
mToast.setGravity(Gravity.CENTER, 0, 0);
mToast.show();
}
@JavascriptInterface
public void external(String url) {
mTracker.send(new HitBuilders.EventBuilder().setCategory("Action").setAction("External Link: " + url).build());
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
@JavascriptInterface
public String showToken() {
return gcmToken;
}
@JavascriptInterface
public int showUid() {
SharedPreferences pref = getSharedPreferences("Pref", Activity.MODE_PRIVATE);
int uid = pref.getInt("uid", 0);
return uid;
}
@JavascriptInterface
public void buyPremium() {
bp.purchase(MainActivity.this, PRODUCT_ID);
}
}
我是否必须将每个函数都更改为此代码 (first answer in the question I refered to):
@JavascriptInterface
mWebView.post(new Runnable() {
@Override
public void makeToast() {
// ...
}
});
?
顺便说一句,这就是我在构造函数活动onCreate方法中创建webview的方式:
mWebView = (AdvancedWebView) findViewById(R.id.webView);
mWebView.setListener(this, this);
mWebView.addJavascriptInterface(new JS_Bind(this, mWebView), "Android");
mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
if (!DetectConnection.checkInternetConnection(this)) {
mWebView.loadUrl("file:///android_asset/offline.html");
}
else {
mWebView.loadUrl("http://example.com/tw3/index.php?s=home");
}
【问题讨论】:
标签: java android multithreading webview