我试图允许用户通过我的应用程序WebView
中的 a登录DialogPreference
,这工作正常,但我似乎被困在如何正确地做到这一点上。
如果我按照下一步执行此操作,则会出现错误
错误
Caused by: android.os.NetworkOnMainThreadException
E/AndroidRuntime(732): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
代码
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
this.webViewOauth = (WebView) v.findViewById(R.id.web_oauth);
try {
String authURL = this.backend.getRequestToken().getAuthenticationURL();
webViewOauth.loadUrl(authURL);
}
catch (TwitterException e) {
e.printStackTrace();
}
}
我可以通过更改来解决这个问题ThreadPolicy
,但据我所知,这个限制是有原因的
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
因此,我将其切换为 anAsyncTask
并收到警告
警告
java.lang.Throwable:警告:在线程“AsyncTask #4”上调用了 WebView 方法。所有 WebView 方法都必须在 UI 线程上调用。WebView 的未来版本可能不支持在其他线程上使用。
代码
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
MyLoginTask login = new MyLoginTask(this, v, this.backend);
login.execute();
}
这两种方法都有效,但是有没有一种特定的方法可以正确地做到这一点?这ThreadPolicy
似乎是一种黑客攻击,可能会导致它阻塞 UI 线程,但我不确定它是否真的会,而AsyncTask
根据警告,该方法显然也不正确。
这是设置的合适时间,ThreadPolicy
因为它实际上正在运行 UI 元素?