加载新内容时 Webview 卡住 URL
Webview is stuck when loading new URL
当使用 loadUrl() 加载新 URL 时,标题发生变化,似乎正在加载新网页,但视图卡住了,我可以看到滚动条如何移动以及缩放控制器如何工作,但是视图只是冻结。
只有当从 NFC 标签 加载新的 url 时才会发生这种情况,这是一种非常奇怪的行为,除了 webview 工作正常之外。我必须在 MainActivity 中使用新 URL 向 WebViewActivity 发送广播,但之后视图卡住了,我尝试调用 UIThread 中的方法,但没有成功。
这里是 webView 的设置,webclient 和 chrome client 在最后一段代码中声明。
public void setupWebView() {
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setDisplayZoomControls(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
webView.setWebViewClient(webViewClient);
webView.setWebChromeClient(webChromeClient);
}
下面是我如何调用方法 loadUrl(),broadCastReceiver 负责处理 NFC 意图。
private WebViewClient webViewClient = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
webView.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
progressContainer.setVisibility(View.GONE);
}
};
private WebChromeClient webChromeClient = new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
titleView.setText(view.getTitle());
}
};
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
loadNewUrl(intent);
}
};
public void loadNewUrl(Intent i) {
String fullUrl = i.getExtras().getString(Constants.WEB_URL, "");
progressContainer.setVisibility(View.VISIBLE);
webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl(fullUrl);
}
});
}
问题是我重写了 onPause 方法,每次检测到 NFC 时它都会调用此方法,导致 UI 完全暂停,我也在调用 webview onPause。在我的 MainActivity 中,我有多个触发器,如地理定位、推送通知,它们工作正常,除了 NFC 触发器。
因此,当在 Activity 上检测到 NFC 时,它会在所有其他活动上调用 onPause。
@Override
protected void onPause() {
super.onPause();
webView.onPause();
}
同样在 MainActivity 我正在使用 OnNewIntent() 方法来捕获任何意图
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
//Handles nfc and sends broadcast
} else if (Constants.INTENT_PUSH_NOITIFICATION.equals(intent.getAction())) {
//Handles notification and sends broadcast
}
当使用 loadUrl() 加载新 URL 时,标题发生变化,似乎正在加载新网页,但视图卡住了,我可以看到滚动条如何移动以及缩放控制器如何工作,但是视图只是冻结。 只有当从 NFC 标签 加载新的 url 时才会发生这种情况,这是一种非常奇怪的行为,除了 webview 工作正常之外。我必须在 MainActivity 中使用新 URL 向 WebViewActivity 发送广播,但之后视图卡住了,我尝试调用 UIThread 中的方法,但没有成功。
这里是 webView 的设置,webclient 和 chrome client 在最后一段代码中声明。
public void setupWebView() {
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setDisplayZoomControls(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
webView.setWebViewClient(webViewClient);
webView.setWebChromeClient(webChromeClient);
}
下面是我如何调用方法 loadUrl(),broadCastReceiver 负责处理 NFC 意图。
private WebViewClient webViewClient = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
webView.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
progressContainer.setVisibility(View.GONE);
}
};
private WebChromeClient webChromeClient = new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
titleView.setText(view.getTitle());
}
};
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
loadNewUrl(intent);
}
};
public void loadNewUrl(Intent i) {
String fullUrl = i.getExtras().getString(Constants.WEB_URL, "");
progressContainer.setVisibility(View.VISIBLE);
webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl(fullUrl);
}
});
}
问题是我重写了 onPause 方法,每次检测到 NFC 时它都会调用此方法,导致 UI 完全暂停,我也在调用 webview onPause。在我的 MainActivity 中,我有多个触发器,如地理定位、推送通知,它们工作正常,除了 NFC 触发器。 因此,当在 Activity 上检测到 NFC 时,它会在所有其他活动上调用 onPause。
@Override
protected void onPause() {
super.onPause();
webView.onPause();
}
同样在 MainActivity 我正在使用 OnNewIntent() 方法来捕获任何意图
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
//Handles nfc and sends broadcast
} else if (Constants.INTENT_PUSH_NOITIFICATION.equals(intent.getAction())) {
//Handles notification and sends broadcast
}