WebView预加载

- 场景:

单Activity中有很多Fragment,Fragment中使用webview;如果不进行优化每次重新进入Fragmeng都会看到webview加载url的一个漫长过程; 避免这种情况,我的思路是:提前实例化webview,用一个容器将这些实例装起来,用到的时候取出来addView(WebView到布局中);

- 先贴出使用代码,后边补充预加载相关类:

在MainActivity中初始化启动预加载:

private void  preWebView(){

    for (String url: Urls.getUrls()) {

        if (url!=null){

            WebViewTool.getInstance().putWebView(url,new MyWebView(mContext,url));

        }

    }

}

Fragmetn中使用webview;

public class WaterAnalysisFragment extends BaseFragment {

    private String url = Api.IP + "wateranalysis";

    @BindView(R.id.ll)

    LinearLayout ll;

    MyWebView webView;

    @Override

    protected int getLayoutId() {

        return R.layout.water_frament_analysis;

    }

    public static WaterAnalysisFragment newInstance() {

        return new WaterAnalysisFragment();

    }

    @Override

    protected void initEventAndData() {

        webView = WebViewTool.getInstance().getWebView(url);

        if (webView != null) {

            int childCount = ll.getChildCount(); 

            if (childCount > 0) {

            } else {

                ll.addView(webView);

            }

        } else {

            webView = new MyWebView(mContext, url);

            webView.loadWebUrl(url);

            ll.addView(webView);

        }

    }

    /**

    * 如果放在 onDestroyView中销毁容易报错:Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

    * 快速返回activity在快速重复进入就会报错,因为onDestroyView 有一定延迟;=按返回家不一定销毁

    */

    @Override

    public void onPause() {

        if (webView != null) { 

            WebViewTool.getInstance().removeWebView(webView);

        }

        super.onPause();

    }

}

---------------------ok,这样就实现了加载webview秒开的效果-------------------------------------------------

补充预加载相关类:

1:需要预加载的url地址

public class Urls {

    private static List<String> urls; // 需要预加载的url集合

    static {

        urls = new ArrayList<>();

        urls.add("https://www.baidu.com/");

        urls.add("http://192.168.0.96:8888/onlinemonitoring");

        urls.add("http://192.168.0.96:8888/wateranalysis");

    }

    public static List<String> getUrls() {

        return urls;

    }

}

2:给webview加个进度条;

public class MyWebView extends WebView {

  private Context mContext;

  private ProgressBar progressbar;  //顶部进度条

  private int progressHeight = 8;  //进度条的高度,默认8px

  MyWebChromeClient WebChromeClient;

  public MyWebView(Context context, String url) {

      super(context);

      mContext = context;

      if (url!=null){

        loadWebUrl(url);

      }

      setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));

      initWebViewSettings();

  }

  /**在xml布局文件中定义的时候调用*/

  public MyWebView(Context context, AttributeSet attrs, String url) {

      super(context, attrs);

      mContext = context;

      if (url!=null){

        loadWebUrl(url);

      }

      initWebViewSettings();

      setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));

  }

  private void initWebViewSettings(){

      WebSettings settings = getSettings();

      settings.setJavaScriptEnabled(true);//设置WebView是否允许执行JavaScript脚本,默认false,不允许。

      settings.setJavaScriptCanOpenWindowsAutomatically(true);

      settings.setBuiltInZoomControls(false);

      settings.setDomStorageEnabled(true);

      settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

      settings.setDatabaseEnabled(true);

      settings.setAppCacheEnabled(true);

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

        settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);

      }

      //创建进度条

      progressbar = new ProgressBar(mContext, null, android.R.attr.progressBarStyleHorizontal);

//    proDialog=new ProgressBar(mContext, null, android.R.attr.progressBarStyleLarge);

      //设置加载进度条的高度

      progressbar.setLayoutParams(new LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, progressHeight, 0, 0));

      Drawable drawable = mContext.getResources().getDrawable(R.drawable.progress_bar_states);

      progressbar.setProgressDrawable(drawable);

      // 将proDialog设置到容器的中央位置

      //添加进度到WebView

      addView(progressbar);

      WebChromeClient= new MyWebChromeClient(getContext(),progressbar);

      setWebChromeClient(WebChromeClient);

  }

  /**加载远程网页

    * @param webUrl - 远程网页链接地址:比如http://m.baidu.com/*/

  public void loadWebUrl(String webUrl){

      this.loadUrl(webUrl);

  }

  /**加载本地assets目录下的网页

    * @param localUrl - assets目录下的路径:比如www/login.html*/

  public void loadLocalUrl(final String localUrl){

      this.loadUrl("file:///android_asset/"+localUrl);

  }

  ...

}

3:管理类:

public class WebViewTool {

    private Map<String, MyWebView> webViews = new HashMap<>();

    private static class LazyHolder {

        private static final WebViewTool INSTANCE = new WebViewTool();

    }

    private WebViewTool() {

    }

    public static final WebViewTool getInstance() {

        return LazyHolder.INSTANCE;

    }

    public  Map<String, MyWebView> getWebViews() {

        return webViews;

    }

    public void putWebView(String url, MyWebView webView) {

        webViews.put(url, webView);

    }

    public MyWebView getWebView(String url){

        MyWebView webView=webViews.get(url);

        if (webView!=null){

            return webView;

        }

        return null;

    }

    public void  destoryAll(){

        for(Map.Entry<String, MyWebView> entry: webViews.entrySet())

        {

            String key=entry.getKey();

            MyWebView webView= entry.getValue();

            webView.stopLoading();

            webViews.remove(key);

        }

    }

    public  void removeWebView(MyWebView webView) {

      // webView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);

        //webView.clearHistory();

        if (webView!=null){

            ((ViewGroup) webView.getParent()).removeView(webView);

        }

    }

}

4:其他优化,慢慢做去,时间太忙,刚刚实现的顺带做了个笔记;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,406评论 6 538
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,034评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,413评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,449评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,165评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,559评论 1 325
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,606评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,781评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,327评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,084评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,278评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,849评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,495评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,927评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,172评论 1 291
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,010评论 3 396
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,241评论 2 375

推荐阅读更多精彩内容