我正在开发一个应用程序,我在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);
}
}
}
是否有提高性能的想法?
答案 0 :(得分:6)
不幸的是,你无法解决这个问题。但是:
你可以尝试一些事情,还有一些事情需要检查。具体做法是:
您在页面加载时将可见性设置为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