Android WebViewClient работает на тему потока пользовательского интерфейса - PullRequest
1 голос
/ 25 ноября 2011

Попытка очистить устаревший код аутентификации Twitter, который я использовал, поскольку более новые версии Android больше не позволяют выполнять сетевые задачи в потоке пользовательского интерфейса без сбоя приложения.решил половину проблемы, вставив 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 Ответ

2 голосов
/ 25 ноября 2011

Я думаю, что вы должны поместить runOnUIThread() метод в строку webView.setVisibility(View.INVISIBLE);, и она должна работать.

должно быть так:

runOnUiThread(new Runnable() {
   public void run() {
      webView.setVisibility(View.INVISIBLE);
   }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...