UI线程上的WebView Twitter登录窗口

时间:2013-06-02 22:53:43

标签: android webview android-webview

我正在尝试允许用户通过我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元素吗?

1 个答案:

答案 0 :(得分:2)

是的,使用ScrictMode政策 是一个黑客,而且如herehere

所述是一个糟糕的黑客

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

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