我正在尝试允许用户通过我WebView
我的应用程序中的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);
}
所以,我将其切换为AsyncTask
并收到警告
警告
java.lang.Throwable:警告:在线程上调用了一个WebView方法 'AsyncTask#4'。必须在UI线程上调用所有WebView方法。 未来版本的WebView可能不支持在其他线程上使用。
代码
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
MyLoginTask login = new MyLoginTask(this, v, this.backend);
login.execute();
}
这两种方法都有效,但有没有特定的方法来正确地做到这一点? ThreadPolicy
似乎是一个hack并且可能导致它阻止UI线程,但是我不确定它是否真的会,而AsyncTask
方法根据警告显然也是错误的。< / p>
这是设置ThreadPolicy
的合适时间,因为它实际上正在运行UI元素吗?
答案 0 :(得分:2)
是的,使用ScrictMode政策 是一个黑客,而且如here和here
所述是一个糟糕的黑客您有两种方法可以解决这个问题:
1-从MyLoginTask的onPostExecute()方法返回authURL
。只需在调用MyLoginTask的对象中定义一个setter,并让onPostExecute()将结果赋给它。
2-将对webview的引用传递给MyLoginTask,并将其加载到onPostExecute()中的url。因为onPostExecute()将always run in the UI thread,你将摆脱警告。
在任何情况下,请查看Android开发人员关于“无痛线程”的帖子;你肯定会发现它很有帮助:http://android-developers.blogspot.ca/2009/05/painless-threading.html