android webview loadurl慢

时间:2016-02-15 14:26:11

标签: java android android-webview

我正在开发一个应用程序,我在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 个答案:

答案 0 :(得分:6)

不幸的是,你无法解决这个问题。但是:

  • 尝试在Android设备的浏览器中加载您的网址。它更快吗?如果没有,那么你可以做的并不多。

你可以尝试一些事情,还有一些事情需要检查。具体做法是:

  • 您在页面加载时将可见性设置为View.GONE(使您的网页视图不可见),然后在页面加载后再次显示它。 这可能是问题

    没有这个尝试,你可能会发现它会更快。根据我的经验,onPageFinished(..)仅在页面加载后触发一段时间。

  • 页面真的需要JavaScript吗?如果没有,请不要启用它。

  • 如果在您的情况下可以使用,您可以使用像Jsoup这样的HTML解析器从页面中仅提取所需的数据,并将其显示给用户。这会快得多。

    如果页面使用Ajax动态加载数据,您还可以直接从其使用的端点加载数据。在桌面浏览器中打开页面,打开开发人员工具的网络选项卡,了解页面的工作方式并加载数据。

  • 您可以使用shouldInterceptRequest(..)阻止来自WebView的请求。如果页面具有例如的内容,这可能会有所帮助。 Facebook共享按钮或您不需要的额外图像。阻止这些将加快加载时间。

如果您向我们展示了您正在使用的网址,也许我可以进一步调查并告诉您如何在您的情况下加快速度。如果有帮助,请告诉我。

答案 1 :(得分:1)

我认为取决于需要下载的数据量。还要记住,当您处于调试模式时,应用程序要慢得多,因为它必须跟踪所有信息。

也许此链接可以帮助您提高效果:

答案 2 :(得分:1)

如果你在你的Android应用程序的本地资产中放置所有静态资源(如CSS,JS字体等)并在页面中为您的资源提供相对URL,那么它会在您的webview中加载URL,然后加载速度会快得多。

这是因为您的webview现在正在加载来自您或第三方服务器的所有资源,无论它们存在于哪里,但如果它们位于资源文件夹中,那么您可以在本地加载它们。

因此,您的所有数据和HTML都将来自您的服务器,静态内容将在本地存储和加载。

您已使用loadUrl

的webview的loadDataWithBaseURL方法

这是一篇有用的详细文章 http://www.codewithasp.net/2016/06/speedup-android-webview-app-localise-static-resources.html