【问题标题】:Why loading webview sometimes works and sometimes finishes fast?为什么加载 webview 有时会起作用,有时会很快完成?
【发布时间】:2016-08-31 08:06:58
【问题描述】:

我有一个使用webview 的安卓应用。我展示了我的整个网站。我的问题是,当我单击导航上的按钮以加载页面时,有时它们会通过第一次触摸打开,有时没有任何效果。我必须触摸按钮 2 次、3 次或更多次,它们才会打开。

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

通过使用pageStart() 和页面完成,我看到它开始了,但是当进度百分比为 10 时,pageFinish() 说它已停止加载!

android studio 模拟器中不存在该问题,仅在真实手机中。 (并且存在于不同的手机和安卓版本中)

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

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();
    }
}

【问题讨论】:

  • 它的发生是因为网络互联网速度或连接,电话速度,当你的速度变慢时,如果速度快,那么它会加载更多时间,然后网页视图数据加载速度很快。有时视图会反映你在 webview 中看不到 Perfect 。因为速度....
  • @amitasharma 它发生的次数太多了!我的意思是我不认为这是因为互联网速度,因为它足够好。即使只有“嗨”消息的页面也无法加载!它将所有这些页面加载到 10% 并完成!如果是因为网速,进度必须变慢:(
  • 在您的手机中,您是否在后台检查了一些其他应用程序是否正在运行,如果有其他应用程序正在运行,那么速度可能会变慢......在代码中,您正在将您的 URL 加载到 webview 可能该网址是否有大数据,因此显示需要时间......
  • 您能否确认您的互联网连接稳定且没有请求超时?
  • @amitasharma 是的,其他应用程序也使用互联网!像什么应用程序,电报.. 但我的问题是所有页面加载都停止在 10% !当您强硬或触摸哪个页面或链接时没有什么不同!当达到 10 % onPageFinished(WebView view, String url) 函数显示它!

标签: android webview android-websettings


【解决方案1】:

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

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

注意:onLoadResource 是在 extends WebViewClient 的类中实现的

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

希望对大家有所帮助!

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);
        }
    }

【讨论】:

    【解决方案2】:

    我有一些类似的问题,我在 webView 渲染后延迟了 url 加载。

    webView.postDelayed(new Runnable() {
    
                @Override
                public void run() {
                    fetchData();
                }
            }, 500);
    

    【讨论】:

    • 可能这是一个很好的解决方案,但它会等待 0.5 秒。是否有任何事件可以了解页面正在加载?我的意思是,开始加载,明白它没有加载并推迟500毫秒。
    • 是的,正如您在上面的问题中看到的,有两种方法WebViewClient onLoadResourceonPageFinished 可以帮助您识别正在加载和完成的资源。
    • 是的,也可以onPageStarted 开始。我没有遇到这种情况,所以问一下,如果页面在 500 毫秒内没有完成,如果立即启动并重新加载该怎么办。
    • 我可能没有让你正确.. 但上述解决方案并未说明页面将在 500 毫秒内完成重新加载。渲染完成后,它实际上开始在 Webview 中加载 url 的过程。所以你可以说在 Webivew 呈现后 500 毫秒开始获取页面......因为我面临的问题是我的 Webview 在并行线程中呈现以获取 url,所以我延迟到 500 毫秒以确保加载 url Webview 渲染后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    相关资源
    最近更新 更多