NeoBaseLibV2
Android BaseLib Version 2
2017-06-01
接口请求说明:
-
添加请求类
1.新建BaseRequest并实现IBaseRequest 2.add(key,value)可以添加请求参数,公共参数已经添加无需关系,只要添加业务相关参数 3.getApi()添加必要api 4.getResponseClazz()添加必要ResponseData序列化类
-
新建MVP,可参考登录相关
1.mvp.contract包中新建一个相关的Contract接口,里面包含操作的View,Presenter,Intractor接口 2.分别在presenter和interactor包中建立实现类,实现Contaract声明的接口 3.
-
MVP使用方式
1.对应的Activity实现View接口,例如登录LoginActivity实现LoginContract.View接口 2. Activity的initPresents中创建Presenter具体实例 @Override public LoginContract.Presenter initPresents() { return new LoginPresenterImpl(this); } 3.基类的mPresenter即可使用Presenter中相应方法
ps:Contract是一个契约接口,没有实现,只是将MVP三个接口管理在了一起,我们找到相关的contract即可知道
对应的界面有哪些逻辑。具体实现通过实现类去实现。
M:Contract.Interactor数据提供,可以是网络或者数据库
V:Contract.View界面相关
P:Contract.Presenter主持人,从Interactor(数据层)拿到数据从而指挥View(界面相关)
技术选型:
- Fresco:高效解决图片加载OOM问题
- Butterknife:通过注解方式findViewById和setOnClickListener等,其发生在编译期,不会影响app性能
- Retrofit:高效网络请求,定制化强,并有取消请求功能
- Fastjson:高效服务器数据序列化
- EventBus:模块之间通信
- RecycleView Adapter:新建Adapter集成XBaseAdapter
UI篇:
-BaseActivity封装了顶部和内容布局,未完待续
同理BaseFragment
网络框架篇:
HttpLoader处理所有请求:
HttpLoaderConfiguration configuration = new HttpLoaderConfiguration.Builder()
.setServerHost(Constants.SERVER_HOST) //配置服务器地址
.setEnableCache(false) //是否开启网络缓存
.setTimeout(15) //超时时间设置,单位秒
.setHttpHandler(HttpHandler.class) //设置网络返回处理类
.build();
HttpLoader.getInstance().init(configuration);
HttpHandler:
extends BaseHttpHandler,并实现方法,可参考DefaultHttpHandler
图片加载篇:
使用Facebook出品的Fresco加载图片,并且封装在XImageView中,App使用的所有需要加载网络图篇的请求请使用XImageView引用,
方便日后的框架替换和维护
业务逻辑MVP:
采用MVP方式:
-M:即MVP包中interactor包,代表数据提供器
-V:在contract契约类中,操作VIew层的接口
-P:即MVP包中的present包,代表业务处理
管理mvp:引入contract契约类管理mvp接口,减少类的数量
Application理解
-
数据缓存
1.获取字段数据一律使用getter setter,并且需缓存,不提供static方式获取, 2.getter中需要判断内容是否为空,如果为空取本地缓存
-
Activity的生命周期监听
通过registerActivityLifecycleCallbacks注册监听,统一管理每个Activity
-
全局共享方法
提供与外界调用,如:账户模块(AccountManager)、App退出等等。复写onLowMemory方法,及时清理内存,如图片内存等
-
必备权限的申请
WRITE_EXTERNAL_STORAGE && READ_EXTERNAL_STORAGE && READ_PHONE_STATE 是应用使用的必备权限,Application需要
提前判断是否有这些权限在初始化有关设备信息等,否则需要放到Splash页面进行弹框申请,同意之后才可初始化Application中
的业务,包括第三方SDK的的初始化问题 -
与App进程数有关,启动App有几个进程,Application将会初始化几次,解决方式如下:
String processName = getProcessName(this, android.os.Process.myPid()); if (processName != null) { boolean defaultProcess = processName.equals(Constants.REAL_PACKAGE_NAME); // 默认的主进程启动时初始化应用 if (defaultProcess) { initAppForMainProcess(); } // 其他进程启动时初始化对应内容 else if (processName.contains(":process1")) { } else if (processName.contains(":process2")) { } }
Fragment
-
实例化
定义static的newInstance方式,参数通过setArguments()方式添加,而不建议通过为Fragment添加带参数的构造函数,因为通过setArguments()方式添加,
在由于内存紧张导致Fragment被系统杀掉并恢复(re-instantiate)时能保留这些数据,在Fragment的onAttach()中通过getArguments()获得传进来的参数,
并在之后使用这些参数 -
Activity获取
获取Activity对象,不建议调用getActivity(),而是在onAttach()中将Context对象强转为Activity对象
-
常见异常
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1341)
该异常出现的原因是:commit()在onSaveInstanceState()后调用。首先,onSaveInstanceState()在onPause()之后,onStop()之前调用。onRestoreInstanceState()在onStart()之后,onResume()之前。因此避免出现该异常的方案有:
不要把Fragment事务放在异步线程的回调中,比如不要把Fragment事务放在AsyncTask的onPostExecute(),因此onPostExecute()可能会在onSaveInstanceState()之后执行。
逼不得已时使用commitAllowingStateLoss()。使用ButterKnife,Fragment在onDestroyView需要unbind。
-
与ViewPager结合
1.FragmentPagerAdapter和FragmentStatePagerAdapter区别:比较其destroyItem方法,
FragmentPagerAdapter中detach Fragment,只是脱离Activity,未真正释放Fragment,而FragmentStatePagerAdapter
是remove,真正释放了Fragment,更适合页面比较多的情况。2.懒加载:见库BaseLazyFragment
-
SO文件引用
abiFilters 'armeabi', 'x86', 'armeabi-v7a' 'arm64-v8a', 'x86_64', 'mips', 'mips64'
经过调研微信、淘宝、淘宝、网易严选,其APP引用的只有armeabi架构下的so文件,可参考之
常见内存泄露
静态变量
单例
内部类
线程
-
Handler和AsyncTask
弱引用,Handler类定义为static内部类
资源未关闭
WebView
WebView
//设置5.0以上开启混合模式
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
销毁:
mWebView.clearCache(true);
//1.解除webView与父控件的依附关系 2.解决退出页面音频还在播放问题
mRlWebViewRoot.removeView(mWebView);
mWebView.removeAllViews();
mWebView.setVisibility(View.GONE);
mWebView.destroy();
//防止Https请求网页空白
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
//handler.cancel(); 默认的处理方式,WebView变成空白页
handler.proceed();
//handleMessage(Message msg); 其他处理
}