安卓WebView加载URL很慢

5

我正在开发一个应用程序,其中我在Webview中加载来自外部URL的网页。 加载页面需要很长时间,需要30秒到1分钟的时间才能加载完成。 请查看我的代码:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;

public class WebActivity extends AppCompatActivity {

    private WebView webView;
    private ProgressBar progressBar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        webView = (WebView)findViewById(R.id.webView);
        progressBar= (ProgressBar)findViewById(R.id.progressBar2);
        String link = getIntent().getExtras().getString("webLink");
        String title = getIntent().getExtras().getString("webTitle");
        setTitle(title);
        webView.setVisibility(View.GONE);
        progressBar.setVisibility(View.VISIBLE);
        Log.d("WEB", link);
        webView.setWebViewClient(new MyBrowser());
        webView.getSettings().setJavaScriptEnabled(true);
        //webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webView.getSettings().setLoadWithOverviewMode(true);
        webView.getSettings().setUseWideViewPort(true);
        webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);

        //webView.getSettings().setDomStorageEnabled(true);
        //webView.getSettings().setAppCachePath(String.valueOf(getCacheDir()));
        //webView.getSettings().setAppCacheEnabled(true);
        webView.getSettings().setSupportZoom(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.loadUrl(link);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon in action bar clicked; goto parent activity.
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    public class MyBrowser extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return super.shouldOverrideUrlLoading(view, url);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            webView.setVisibility(View.VISIBLE);
            progressBar.setVisibility(View.GONE);
        }
    }



}

有什么想法可以提高性能吗?
3个回答

7

很遗憾,你无法做太多事情来修复这个问题。不过:

  • 尝试在你的安卓设备浏览器中加载URL。速度更快吗?如果不是,那么你无能为力。

不过有几件事情你可以尝试,以及一些需要检查的事项。具体如下:

  • 在页面加载时,将可见性设置为View.GONE(使网页视图不可见),然后在页面加载完成时再将其设置为可见状态。 这可能就是问题所在

    请取消这个操作,你会发现页面加载速度会更快。据我的经验,onPageFinished(..)事件只会在页面加载完成后一段时间才会触发。

  • 这个页面真的需要启用JavaScript吗?如果不是,请不要启用。

  • 如果你的情况允许的话,你可以使用HTML解析器,比如Jsoup,从页面中提取你想要的数据,并将其显示给用户。这样会更快。

    如果页面使用Ajax动态加载数据,你也可以直接从它使用的端点加载数据。在桌面浏览器中打开页面,打开开发者工具的网络选项卡,找出页面是如何工作和加载数据的。

  • 你可以使用shouldInterceptRequest(..)阻止WebView的请求。如果页面中有Facebook分享按钮或额外的图像等你不需要的内容,阻止它们会加快加载速度。

如果你能向我们展示你正在使用的URL,我可以进一步调查并告诉你如何在你的情况下加快网页加载速度。让我知道它是否有帮助。


尝试应用它,我会给你一个答案。 - Mulham Aryan
非常感谢,问题已解决!问题出在webView.setVisibility(View.GONE)这一行代码上面。 :D - Mulham Aryan
@MulhamAryan,很高兴能帮上忙 :-) - Jonas Czech
onfinishloading会在所有页面脚本、CSS等加载完成后触发,但是您可以在它们加载完成之前使用您的网站,这不是技术问题,而更多地是用户体验问题。我很高兴您能解决它。 - encastellano

2
我认为这取决于需要下载的数据量。同时请记住,在调试模式下,应用程序会变得更慢,因为它必须跟踪所有信息。
也许这些链接可以帮助您提高性能:
- WebView 性能 - WebView 性能 2

我已经在从Google Play安装应用程序后进行了测试,所有用户都遇到了相同的问题,他们说当他们想要打开一个URL时速度非常慢。 - Mulham Aryan
最终用户不是一个好的测试人员,如果网站很重且网络质量差,您无法做任何事情来提高性能。您需要使用良好的连接进行测试并得出自己的结论。很抱歉无法提供更多帮助。 - encastellano
也许如果您不等待加载完成就显示Web视图,用户体验会更好。 - encastellano
首先感谢您的评论,每一个评论都可能会产生影响。但是关于连接问题,我测试了四种不同类型的连接,第一种连接速度为256KB,最好的连接速度为4MB,但所有连接都给出了相同的结果,我不知道为什么! - Mulham Aryan

1
在加载网页时,如果您将所有静态资源(如CSS、JS字体等)放在Android应用程序的本地资产文件夹中,并在页面中给出相对URL,那么它将加载得更快。
这是因为现在您的Webview正在从您或第三方服务器加载所有资源,无论它们存在于哪里,但如果它们在资产文件夹中,则可以在本地加载它们。
因此,总体上,您的数据和HTML将来自您的服务器,静态内容将被存储并在本地加载。
您需要使用Webview的loadDataWithBaseURL方法而不是loadUrl方法。
这是一篇详细的文章,可能会有所帮助 http://www.codewithasp.net/2016/06/speedup-android-webview-app-localise-static-resources.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接