NeoBaseLib库

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的的初始化问题

  • onCreate多次调用

    与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); 其他处理
     }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容