2011-11-25 62 views
1

試圖清理一些過時的Twitter身份驗證代碼我一直使用作爲新版本的android不允許在ui線程上完成網絡任務而不會崩潰應用程序。在UI線程問題上運行的android webviewclient

我似乎通過堅持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()的構造函數;方法呢?

回答

2

我認爲你需要在runOnUIThread()方法webView.setVisibility(View.INVISIBLE);行,它應該工作。

它應該是這樣的:

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