为什么加载webview有时会工作,有时候会快速完成?

时间:2016-08-31 08:06:58

标签: android webview android-websettings

我有一个使用pageStart()的Android应用。我展示了我的整个网站。我的问题是,当我点击导航上的按钮加载页面时,有时他们会通过第一次触摸打开,有时无效。我必须触摸按钮2次,3次或更多次才会打开。

这也适用于网站中的网址。这真是奇怪的行为,我不知道原因。

通过使用pageFinish()和页面完成,我看到它开始但是当进度百分比为10 webView = (WebView) findViewById(R.id.webview1); webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setLoadWithOverviewMode(true); webSettings.setAllowFileAccess(true); if (Build.VERSION.SDK_INT >= 19) { webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); } else if (Build.VERSION.SDK_INT >= 11 && Build.VERSION.SDK_INT < 19) { webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } public boolean onNavigationItemSelected(MenuItem item) { // Handle navigation view item clicks here. int id = item.getItemId(); if (id == R.id.searchAds) { startWebView("http://www.test.com/"); } else if (id == R.id.myPage) { startWebView("http://www.test.com/profile"); } else if (id == R.id.allNewPosts) { startWebView("http://www.test.com/"); } else if (id == R.id.followingsNewPosts) { startWebView("http://www.test.com/new/"); } else if (id == R.id.followingsNewPosts) { startWebView("http://www.test.com/categories/"); } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } private void startWebView(String myURL) { if (!isNetworkStatusAvialable(getApplicationContext())) { Toast.makeText(getApplicationContext(),"No internet access" ,Toast.LENGTH_LONG).show(); } else { webView.setWebViewClient(new Client()); webView.setWebChromeClient(new ChromeClient()); webView.loadUrl(myURL); } } public class Client extends WebViewClient { ProgressDialog progressDialog; public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { } //If you will not use this method url links are open in new brower not in webview public boolean shouldOverrideUrlLoading(WebView view, String url) { if (!url.contains("test.com")) { view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); return true; } else { view.loadUrl(url); return true; } } //Show loader on url load public void onLoadResource(WebView view, String url) { // Then show progress Dialog if (progressDialog == null && url.contains("test.com")) { // in standard case YourActivity.this progressDialog = new ProgressDialog(MainActivity.this); progressDialog.setMessage("loading ..."); progressDialog.show(); } } // Called when all page resources loaded public void onPageFinished(WebView view, String url) { try { // Close progressDialog if (progressDialog.isShowing()) { progressDialog.dismiss(); progressDialog = null; progressRunning = false; } } catch (Exception exception) { exception.printStackTrace(); } } 时表示它已停止加载!

问题在Android工作室模拟器中不存在于真实手机中。 (并存在于不同的手机和Android版本中)

如果需要,这是我的代码的一部分。

{{1}}

2 个答案:

答案 0 :(得分:1)

我知道我参加聚会完全迟到了,但我遇到了同样的问题,我设法为遇到问题的人找到了解决方法。我的经验是,大约 10 次中的 7-8 次,webView 会正确加载,但有时它不会没有特别的原因,至少我的理解是。

我仍然不知道这是什么原因,但是因为这种行为只涉及 10% 的进度(经过无数次运行,我从来没有在 10% 之前或之后卡住过)和大多数调用成功后,当进度为 10% 时,我会启动一个 postDelayed Runnable,它将在一段时间后运行。如果经过这段时间后进度仍为 10%,我只需重新加载 URL。由于大多数调用都是成功的,因此即使连续失败,用户也可能只会遇到几秒钟的延迟,但肯定会加载 url。就个人而言,它从来没有让我失望过。

注意: onLoadResourceextends WebViewClient

的类中实现

警告:我使用这个逻辑来加载一些文档和静态页面。如果您希望您的网络视图前进、后退等。我建议还根据您的 API 实施 shouldOverrideUrlLoading(WebView view, String url)shouldOverrideUrlLoading(WebView view, WebResourceRequest request),并相应地更改 view.loadUrl(yourURL) 中的网址!

希望对大家有所帮助!

private int _progress = 0;
    @Override
    public void onLoadResource(final WebView view, String url) {
        super.onLoadResource(view, url);
        _progress = view.getProgress();
        if (_progress == 10){
            Toast.makeText(ctx, ""+view.getProgress(), Toast.LENGTH_SHORT).show();
            view.postDelayed(new Runnable() {

                @Override
                public void run() {
                    if(_progress == 10){
                        Toast.makeText(ctx, "RELOADING", Toast.LENGTH_SHORT).show();
                        view.loadUrl(yourURL);
                    }
                }
            }, 1500);
        }
        if(view.getProgress() == 100) {
        //URL LOADED
            progressBar.setVisibility(View.GONE);
            view.setVisibility(View.VISIBLE);
        }
    }

答案 1 :(得分:0)

我有类似的问题,我发布了webView渲染后延迟了url加载。

webView.postDelayed(new Runnable() {

            @Override
            public void run() {
                fetchData();
            }
        }, 500);