Это приложение для веб-браузера Android, которое отслеживает ваше время в сети для записей вашего работодателя. Этот веб-браузер имеет проблему с pepsi.com в том, что он проходит бесконечный цикл между функциями onPageStarted и shouldOverrideUrlLoading. Фрагмент кода ниже. Мне пришлось многое отредактировать для обеспечения конфиденциальности компании, но если вам нужно узнать больше, я могу отредактировать этот пост.
private WebViewClient mWebViewClient = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
Logger.i(TAG, "shouldOverrideUrlLoading " + request.getUrl());
if (!mLoadingFinished) {
mRedirect = true;
}
mLoadingFinished = false;
Uri uri = request.getUrl();
mWebView.loadUrl(uri.toString());
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Logger.i(TAG, "onPageStarted " + url);
mLoadingFinished = false;
updateControlBar(false);
// Show loading
}
@Override
public void onPageFinished(WebView view, String url) {
Logger.i(TAG, "onPageFinished " + url);
if (!mRedirect) {
mLoadingFinished = true;
HistoryLog.getInstance().logHistory(url, "");
visitPage();
mCurrentSession.incrementPages();
//In about:test add this javascript after loading.
if (TESTPAGE.equalsIgnoreCase(url.trim())) {
String javaScript = "javascript:/*REDACTED for company privacy*/
view.evaluateJavascript(javaScript, new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) { }
});
}
}
if (mLoadingFinished && !mRedirect) {
// Hide loading
} else {
mRedirect = false;
}
}
@Override
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
if (getActivity() != null) {
mCurrentSession.end();
mActiveTime.setVisibility(View.INVISIBLE);
mElapsedTime.setVisibility(View.GONE);
mShowTime = null;
}
LoginNoticeDialogFragment loginFragment = new LoginNoticeDialogFragment();
try {
loginFragment.passAlongParams (view, handler, host, realm);
if (null != getFragmentManager()) {
loginFragment.show(getFragmentManager(), "Login");
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
ErrorLog.getInstance().logError("Error loading URL " + view.getUrl());
}
};
Ниже приведена функция updateControlBar
private void updateControlBar(boolean upDateAddress) {
mBack.setEnabled(mSettings.appIsEnabled() && mWebView.canGoBack());
mForward.setEnabled(mSettings.appIsEnabled() && mWebView.canGoForward());
mStop.setEnabled(!mLoadingFinished);
if (upDateAddress) {
String url = mWebView.getUrl();
if (url != null) { // Might be null prior to reload
if (url.equals(Config.SERVERWELCOMEPAGEURL)) {
mAddressBar.setText(getString(R.string.web_welcome));
} else if (url.startsWith("data:")) {
mAddressBar.setText("");
} else {
mAddressBar.setText(url);
}
}
}
}
Я попытался установить возвратto shouldOverrrideUrlLoading в false, обновляя shouldOverrrideUrlLoading в не осуждаемый метод, комментируя mWebView.loadUrl (uri.toString ());(это привело к остановке цикла, но браузер показал пустую страницу). Я просмотрел похожие посты на stackoverflow, но большинство проблем с зацикливанием связано с кнопкой возврата. Эта проблема возникает при переходе на pepsi.com. Это не происходит с большинством других веб-сайтов.
Целевой SDK: 29 мин. SDK: 21