在web线程问题上运行的android webviewclient

时间:2011-11-25 14:30:01

标签: java android android-webview

尝试清理一些过时的Twitter身份验证代码,我一直在使用较新版本的android,不再允许在ui线程上完成网络任务而不会崩溃应用程序。

我似乎通过坚持使用webview.loadurl()解决了一半问题。调用异步任务但是当onLoadResource()时,应用程序在进程的第二部分崩溃由webviewclient调用,只是无法弄清楚放置onLoadResource()的最佳方法是什么;在不破坏代码的情况下将方法转换为异步任务。

package com.testapp2.second.activities;

import com.testapp2.second.OTweetApplication;
import com.testapp2.second.R;

import android.app.Activity;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class AuthorizationActivity extends Activity {

private OTweetApplication app;
private WebView webView;

private WebViewClient webViewClient = new WebViewClient() {
@Override
public void onLoadResource(WebView view, String url) {
  // the URL we're looking for looks like this:
  // http://otweet.com/authenticated?oauth_token=1234567890qwertyuiop
  Uri uri = Uri.parse(url);
  if (uri.getHost().equals("otweet.com")) {
    String token = uri.getQueryParameter("oauth_token");
    if (null != token) {
      webView.setVisibility(View.INVISIBLE);
      app.authorized();
      finish();
    } else {
      // tell user to try again 
    }
  } else {
    super.onLoadResource(view, url);
  }
  }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = (OTweetApplication)getApplication();
setContentView(R.layout.authorization_view);
setUpViews();
}

@Override
protected void onResume() {
super.onResume();
new AuthInBg().execute();
}

private void setUpViews() {
webView = (WebView)findViewById(R.id.web_view);
webView.setWebViewClient(webViewClient);
}

private class AuthInBg extends AsyncTask<Void, Void, Void> {

@Override
protected Void doInBackground(Void... arg0) {

    String authURL = app.beginAuthorization();
    webView.loadUrl(authURL);

    return null;
}  

}
}

我应该将异步任务结果更改为OnLoadResource()的构造函数;方法或许?

1 个答案:

答案 0 :(得分:2)

我认为您需要在runOnUIThread()方法中加入webView.setVisibility(View.INVISIBLE);行,它应该有效。

它应该是这样的:

runOnUiThread(new Runnable() {
   public void run() {
      webView.setVisibility(View.INVISIBLE);
   }
});