近来由于项目中大量使用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.
四.使用
- 书写一个类继承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,然后重写相应的方法即可,一般情况下可不必声明此类
至此,封装已完成,可以看到最终的目的就是把一些通用的设置和共有的方法写在基类中,通过功能的不同进行拆分,使得结构清晰,代码不至于冗余,希望对大家有所启发.