美文网首页
NeoBaseLib库

NeoBaseLib库

作者: Neo_duan | 来源:发表于2016-12-14 17:33 被阅读14次

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); 其他处理
     }

相关文章

  • NeoBaseLib库

    NeoBaseLibV2 Android BaseLib Version 2 2017-06-01 接口请求说明:...

  • 公司数据库逻辑

    pro库 drds库 通道库 查询库 pg库 bi库 tidb库 odps查询 pro库和drds库是线上数据库 ...

  • Lua库函数概览

    Lua库函数概览数学库 table库 字符串库 IO库 os库 调试库

  • Swift 静态库调研

    一、关于库的背景知识1、静态库和动态库静态库动态库系统动态库Cocoa Touch Framework静态库 v....

  • iOS 创建静态库(.a)

    静态库(.a) 文章类型: 学习笔记 1. 静态库简介 库的概念: 什么是库? 库的分类: 库的存在形式: 静态库...

  • 目录一、库二、静态库、动态库、Framework三、打包静态库 1、.a静态库和.framework静态库的区别 ...

  • iOS 静态库和动态库的制作

    静态库和动态库 一、静态库和动态库的存在形式 静态库: .a 和 .framework 动态库: .dylib 和...

  • 动态库与静态库相互连接

    动态库--动态库 场景:App --> 动态库A --> 动态库 B 存在问题:动态库B应该的路径 = 动态库A的...

  • Python解析库

    Python解析库 目录一、lxml库二、BeautifulSoup库三、PyQuery库 一、lxml库 教程:...

  • HCMediator组件化详解

    组件化创建流程库 组件化需要创建私有spec库(索引库)、HCMediator库(App中介库)、其他组件库 私有...

网友评论

      本文标题:NeoBaseLib库

      本文链接:https://www.haomeiwen.com/subject/ooaimttx.html