Webview的封装

本文介绍了一种针对Android中WebView组件的封装方法,通过创建基类减少重复代码,提高开发效率。主要包括BaseWebActivity、BaseWebBridge及BaseWebClient的设计与实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近来由于项目中大量使用webview来加载web页面,所以对webview进行封装,以便减少冗余代码,提高开发效率.

一.webview的基类BaseWebActivity

书写一个webView 的基类 主要负责处理webview的公共方法,这里贴出主要代码,至于webview的基本使用,请自行get.

 /**
     * @return 写一个类继承BaseWebBridge 然后返回过来
     */
public abstract BaseWebBridge getwebBridge();

    /**
     * @return 获取一个继承BaseWebClient
     */
public abstract BaseWebClient getWebClient();
public void initWeb() {
        mWebView = getWebView();
        if (mWebView == null) {
            return;
        }

        mWebSettings = mWebView.getSettings();
        mWebView.clearHistory();
        mWebSettings.setLoadWithOverviewMode(true);
        mWebSettings.setUseWideViewPort(true);
        // 设置WebView属性,能够执行Javascript脚本
        mWebSettings.setJavaScriptEnabled(true);
        //设置 缓存模式 不用缓存 使用localStorage
        mWebSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        mWebSettings.setDomStorageEnabled(true);
        mWebSettings.setAppCacheMaxSize(1024 * 1024 * 8);
        String absolutePath = mContext.getApplicationContext().getCacheDir().getAbsolutePath();
        mWebSettings.setAppCachePath(absolutePath);
        mWebSettings.setAllowFileAccess(true);
        mWebSettings.setAppCacheEnabled(true);
        mWebSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);

        //---------设置桥梁类-----------------------
        BaseWebBridge baseWebBridge = getwebBridge();
        if (baseWebBridge == null) {
            baseWebBridge = new BaseWebBridge(this, mRxmanager);
        }
        mWebView.addJavascriptInterface(baseWebBridge, "bb");
        //----------------------------------------
        //---------设置webclient-------------------
        BaseWebClient webClient = getWebClient();
        if (webClient == null) {
            webClient = new BaseWebClient(this);
        }
        mWebView.setWebViewClient(webClient);
        //-----------------------------------------
    }

上面的代码主要是对webview做一些初始化操作,相信了解webview的童鞋都可以明白

二.桥梁类基类BaseWebBridge

这个类主要用于书写web端调用的方法,基类中书写web页面通用的方法

/**
     * 打电话的方法
     */
    @JavascriptInterface
    public void call(final String phone) {
        if (TextUtils.isEmpty(phone)) {
            return;
        }
        Disposable subscribe = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                e.onNext(phone);
            }
        }).observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        toGetPhonePermission(s);
                    }
                });
        mRxManager.addDisposable(subscribe);
    }

上面代码就是一个打电话的方法,因为有几个页面用到,所以写在基类中

三. WebClient的基类BaseWebClient

@Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (mActivity.checkNetWorkEnable()) {
            view.loadUrl(url);
        } else {
            mActivity.showNonNetPage();
        }
        return true;
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        mActivity.mUrl = url;
        if (mActivity.checkNetWorkEnable()) {
            mActivity.onLoading();
        } else {
            mActivity.showNonNetPage();
        }
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        //延时300毫秒 以防闪烁
        Observable.timer(300, TimeUnit.MILLISECONDS)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Long>() {

                    private Disposable mD;

                    @Override
                    public void onSubscribe(Disposable d) {
                        mD = d;
                    }

                    @Override
                    public void onNext(Long value) {
                        mActivity.loadSuccess();
                    }

                    @Override
                    public void onError(Throwable e) {
                        mActivity.showNonNetPage();
                    }

                    @Override
                    public void onComplete() {
                        if (mD != null) {
                           mD.dispose();
                        }
                    }
                });
    }

相信大家看了代码就清楚这个类是干嘛的了,如果我们想要在页面加载前拦截url或者是在页面加载完成后做一些控件显示隐藏的功能,可以写一个类继承BaseWebClient.

四.使用

  1. 书写一个类继承BaseWebActivity,这个类主要做一些初始化界面的操作,设置webBridge和WebClient(如果必要)
@Override
public BaseWebBridge getwebBridge() {
     return new NewsDetail2Bridge(this,mRxmanager);
  }

  @Override
    public BaseWebClient getWebClient() {
        return new BaseWebClient(this);
    }

2.书写一个类继承BaseWebBridge,这个类主要用于书写web端要调用的方法,例如

@JavascriptInterface
    public void editData() {
        Disposable subscribe = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                e.onNext("1111");
                e.onComplete();
            }
        }).observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        ((PersonalShowActivity) mActivity).startActivity();  
                    }
                });
        mRxManager.addDisposable(subscribe);

    }

这个方法主要用于点击web页面上的编辑按钮跳转到新的activity

3.如果需要在加载web页面前或者页面加载完成后做一些操作,可以书写一个类继承BaseWebClient,然后重写相应的方法即可,一般情况下可不必声明此类

至此,封装已完成,可以看到最终的目的就是把一些通用的设置和共有的方法写在基类中,通过功能的不同进行拆分,使得结构清晰,代码不至于冗余,希望对大家有所启发.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值