0

我试图允许用户通过我的应用程序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 元素?

4

1 回答 1

2

是的,使用 ScrictMode 策略是一种黑客攻击,并且如此此处所述,是一种可怕的策略

你有两种方法可以解决这个问题:

1-authURL从 MyLoginTask 的 onPostExecute() 方法返回。只需在调用 MyLoginTask 的对象中定义一个 setter,并让 onPostExecute() 将结果分配给它。

2- 将对您的 webview 的引用传递给 MyLoginTask,并让它在 onPostExecute() 中加载 url。因为 onPostExecute() 将始终在 UI 线程中运行,您将摆脱警告。

无论如何,请查看 Android 开发人员关于“无痛线程”的这篇文章;你肯定会发现它很有帮助:http ://android-developers.blogspot.ca/2009/05/painless-threading.html

于 2013-06-03T01:48:02.893 回答