野火🔥

自定义Android开源库CSKit介绍

2016/04/02

自定义Android开源库CSKit介绍

整个项目框架包含单例管理(MManagerCenter),网络请求及文件下载(VolleyPlus)和事件总线管理(MMBus)的一个集合框架。还处于检验阶段,使用方法(Android studio):

在Project的gradle文件中增加:

1
2
3
4
5
repositories {
maven {
url "http://dl.bintray.com/droison/maven"
}
}

在使用的module增加:

1
compile 'xyz.chaisong.cskit:cskit:0.0.3'

项目的Github地址为http://github.com/droison/CSKit

1、MManagerCenter

主要用于针对整个App的单例管理,已经在好奇心日报上线使用1年多,稳定性和可用性经过检验。

基于Android的一个单例工厂,源于前公司wechat iOS版本的MManagerCenter的思想,进行Android领域的实现。

整个项目线程安全。

一般单例用于Android中的manager或者controller角色,本MManagerCenter会在程序前后台切换,程序退出以及内存警告等情况下通知维护的manager

快速上手

  • 1、在App的Application中加入
    MManagerCenter.init().configDebug(isDebugMode)
  • 2、将需要单例管理的class继承MManager(推荐)或实现MManagerInterface
  • 3、单例程序的初始化方法需要设定为public
  • 4、使用以下代码获取单例
    MManagerCenter.getService(PraiseDAO.class)

进阶使用

  • 在application的ActivityLifecycleCallbacks中进行后台和前台切换的识别,并在对应位置分别调用MManagerCenter.callEnterBackground()和MManagerCenter.callEnterBackground()。
  • 在程序退出的时候调用MManagerCenter.callTerminate()。
  • 在程序中用户登陆和退出的时候分别调用MManagerCenter.callReloadData()和
    MManagerCenter.callClearData()。
  • 如果对已存在的Manager不满意,可以通过MManagerCenter.removeManager(Manager.class)的方式进行移除。

详细介绍

各种配置都在MManagerInterface进行了标记:

  • isManagerRemoved:默认为false,当为true表示已经被MManagerCenter移除
  • isManagerPersistent:默认为false,当为ture表示程序在退出时不销毁该Manager,属于那种生命周期和Application相同的。
  • void onManagerInit(Context context):Manager初始化会调用,做一些需要Context的初始化操作,建议所有的初始化都放在这里,取代默认的构造方法初始化。传入的context为ApplicationContext。
  • void onManagerEnterBackground():进入后台调用。需要app在进入后台的时候调用MManagerCenter.callEnterBackground()。
  • void onManagerEnterForeground():进入前台调用。需要app在进入前台的时候调用MManagerCenter.callEnterForeground()。
  • void onManagerTerminate():程序退出调用。需要app在退出的时候调用MManagerCenter.callTerminate()。
  • void onManagerClearData():账号退出时调用,清理当前与用户相关的数据。需要app在用户退出的时候调用MManagerCenter.callClearData()。
  • void onManagerReloadData():完成切换帐号后调用,一般用于重新load用户相关的数据。需要app在用户完成登陆的时候调用MManagerCenter.callReloadData()。

2、VolleyPlus

项目命名为Volley Plus,是基于谷歌开源的网络请求框架Volley的一些扩展支持,完美兼容现有Volley的全部接口和使用方法。基于的Volley版本为20151025。

现有扩展包括:

  • 1、在原有Volley架构基础上增加对文件下载的支持。该文件下载不走默认的volley缓存,也不会绑定cache的header,只通过判断存储位置是否存在该文件,默认认为一个url唯一对应一个文件。文件下载会对回调下载进度,可以取消下载。该下载支持断点续传。
  • 2、对Request增加Delivery属性,可以通过设置该属性自定义该Request的回调线程。原框架的回调线程为RequestQueue初始化时传入的参数,若该参数不传,即为默认主线程。

需求起源于好奇心日报好奇心Android中除了一般网络请求外,需要进行wifi条件的文章预加载,预加载过程需要在请求文章详情后根据返回值再预加载该文章的js和css文件,因此引入文件下载;本着尽可能避免ui线程的计算(这种预加载很可能在短时间大量回调主线程),将主线程并不需要的request回调到约定的线程。

项目在好奇心日报好奇心Android的3.0线上版本中使用,并持续维护中。

使用文件下载

初始化一个FileDownloadManager:

1
FileDownloadManager(File rootDirectory, RequestQueue queue, ResponseDelivery defaultDelivery, int parallelTaskCount);
  • 该manager最好在程序中用单例进行管理。
  • rootDirectory表示文件下载的保存目录,该名称在启动新下载时未传入保存文件的file时有效。
  • queue即volley的RequestQueue。
  • 传入的delivery表示该下载器中所有回调都在delivery所在线程。
  • parallelTaskCount为可以并行进行的下载,要求该值不得大于传入queue的并行下载线程数。

启动一个下载:

  • add(String url, FileDownloadListener listener)。这种情况会保存在rootDirectory目录下,文件名为url的md5值
  • add(File storeFile, String url, FileDownloadListener listener)。表示下载完成后会保存到storeFile位置。

使用自定义Prefetcher线程的Delivery

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PrefetcherThread prefetcherThread = new PrefetcherThread("PrefetcherThread");
prefetcherThread.start();
ResponseDelivery prefetcherDelivery = new ExecutorDelivery(new Handler(prefetcherThread.getLooper(), prefetcherThread));
StringRequest request = new StringRequest(Request.Method.GET, null, null);
request.setDelivery(prefetcherDelivery);
private static class PrefetcherThread extends HandlerThread implements Handler.Callback {
public PrefetcherThread(String name) {
super(name);
}
@Override
public boolean handleMessage(Message msg) {
System.out.println("handleMessage CurrentThread = " + Thread.currentThread().getName());
return true;
}
}

未来希望增加的扩展

  • 1、扩展DiskBasedCache,增加对file下载中缓存的识别的支持,用volley已有的机制来避免已缓存却重复下载的问题,以及并行同url下载单一请求的优化。通过识别该file存储位置是否存在文件来判断是否缓存过;在启动下载时通过传入refreshNeeded 来确认在有缓存的时候是否需要重新下载,默认为false。
  • 2、默认文件缓存目录的数据文件上限设置,超过上限做清理。文件下载不做过期配置,本地数据管理参考iOS框架SDWebImage的本地缓存管理机制,在超过上限的情况下删除最远下载的文件。
  • 3、https的支持。

3、MMBus

一个事件总线,主要参考otto的事件总线管理,默认工作在主线程,区别在于事件发送更加精准,针对interface进行广播,而不是过去传入参数方式,可以有效的利用编译器的警告和高亮进行代码编写。

当前不完善,未在实际项目中检验。

CATALOG
  1. 1. 自定义Android开源库CSKit介绍
    1. 1.1. 1、MManagerCenter
      1. 1.1.1. 快速上手
      2. 1.1.2. 进阶使用
      3. 1.1.3. 详细介绍
    2. 1.2. 2、VolleyPlus
      1. 1.2.1. 使用文件下载
      2. 1.2.2. 使用自定义Prefetcher线程的Delivery
      3. 1.2.3. 未来希望增加的扩展
    3. 1.3. 3、MMBus