Android-Webview onPageFinished Called Twice

У меня есть активность, которая делает аутентификацию OAuth, перехватывая URL-адрес перенаправления, когда он появляется в веб-просмотре. Однако функция onPageFinished почему-то называется по какой-то причине дважды, что действительно испортило мое приложение. Вот код:

public class WebViewActivity extends Activity { private WebView gWebView; final String REDIRECT_URI = "https://localhost:5000/receive_code"; final String CLIENT_ID = "can't post it here"; final String CLIENT_SECRET = "can't post it here"; final String SCOPE = "basic names genomes analyses"; Hashtable<String, String> riskPairs; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.webview); gWebView = (WebView) findViewById(R.id.webView1); gWebView.loadUrl("https://api.23andme.com/authorize/?redirect_uri=" + REDIRECT_URI + "&response_type=code&client_id=" + CLIENT_ID + "&scope=" + SCOPE); Log.d("WEBVIEW", "got to webpage"); gWebView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if (url.startsWith(REDIRECT_URI)) { Log.d("WEBVIEW", "onpagefinished is called"); System.out.println("got to override"); if (url.indexOf("code=") != -1) { //if the query contains code String queryString = null; try { queryString = new URL(url).getQuery(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(queryString); String[] params = queryString.split("&"); String code = null; for (String param : params) { if (param.startsWith("code=")) { code = param.substring(param.indexOf('=') + 1); } } gWebView.setVisibility(View.GONE); new PostRequest().execute(code); // don't go to redirectUri } } } }); } class PostRequest extends AsyncTask<String,Void,String>{ code getting client data...} 

PS Пожалуйста, не отмечайте это как дубликат … Я прочитал аналогичный вопрос в StackOverflow и вызвал ShouldOverrideUrlLoading для меня не работает (именно поэтому я использовал onPageFinished () в первую очередь).

Если URL-адрес в порядке после того, как метод onPageStarted запускается onPageFinished, но если URL-адрес перенаправлен после того, как onPageStarted запускает shouldOverrideUrlLoading, а затем onPageFinished. Вы должны просто проверить, перенаправлен ли URL-адрес загрузки

 private boolean isRedirected; @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { if (!isRedirected) { //Do something you want when starts loading } isRedirected = false; } 

Если URL-адрес перенаправлен, функция обратного вызова запускает эту функцию

 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); isRedirected = true; return true; } 

Прежде чем что-то делать в onPageFinished, проверьте, был ли обратный вызов включен в метод toOverrideUrlLoading

 @Override public void onPageFinished(WebView view, String url) { if (!isRedirected) { //Do something you want when finished loading } } 

Android почему-то вызывает onPageFinished () дважды (и onPageStarted () три раза!), Когда загруженный URL-адрес не работает. Временное решение изменяет redirect_uri на URL рабочего веб-сайта; В этом случае я изменил его на https://www.google.com/ (lol, извините Google). OnPageFinished затем вызывается только один раз.

BUT- Я все еще хочу получить ответы на вопрос о том, почему webview ведет себя по-другому, когда загруженный URL-адрес не является рабочим, и что является лучшим решением, чем изменение redirect_uri на google.com.

Этот трюк помогает мне (не рекомендуется, но помогает)

 private boolean alreadyEvaluated = false; @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Logger.d(TAG, "onPageStarted"); super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { Logger.d(TAG, "onPageFinished"); if (!alreadyEvaluated) { alreadyEvaluated = true; view.loadUrl("javascript:window.MyJavaScript.getPageText(document.getElementsByTagName('body')[0].innerText);"); } else { alreadyEvaluated = false; } super.onPageFinished(view, url); }