Android Next 公共组件库 Tasks, Views, Widgets, Http, Utils
项目介绍
这个库是我在日常开发过程中积累下来的一些可复用组件,有一些是原创的,有一些是修改开源项目的,有一些则完全是从Android源码/Apache-Commons源码中复制过来的,大部分都在我的工作项目和个人项目中有实际使用案例,具体就不一一说明了
最新版本
已经部署到Maven Central,可以直接使用
- 1.0.5 2014.12.22
- 1.0.4 2014.09.15
开始使用
Gradle集成方法:
// core 核心库, 格式:jar和aar compile 'com.mcxiaoke.next:core:1.0.+' // http HTTP组件, 格式:jar和aar compile 'com.mcxiaoke.next:http:1.0.+' // ui UI组件, 格式:aar compile 'com.mcxiaoke.next:ui:1.0.+' // extra-abc 依赖support-v7 AppCompat 格式:aar compile 'com.mcxiaoke.next:extra-abc:1.0.+'
模块结构
分为以下几个模块:
core 核心组件
包含异步任务组件,缓存组件,基础Activity和Service,还有一些工具类,按Java包介绍如下:
-
com.mcxiaoke.next.annotation 两个简单的Annotation,标注是否线程安全,纯标注用
-
com.mcxiaoke.next.app 基础类,包含:
- NextBaseActivity 基础Activity,添加了一些ActionBar相关的封装方法
- NextBaseFragment 基础Fragment,添加了ActionBar和Activity相关的一些封装方法
- MultiIntentService 类似于IntentService,但是可以多个异步任务并发执行,可以在所有任务执行完成后自动stopSelf(),具体请看源码
-
com.mcxiaoke.next.cache 简单缓存类,包含内存缓存MemoryCache和磁盘缓存DiscCache,使用非常简单,可定制
-
com.mcxiaoke.next.collection 几个常用的集合类,包含:NoDuplicatesArrayList, NoDuplicatesCopyOnWriteArrayList, NoDuplicatesLinkedList和WeakFastHashMap
-
com.mcxiaoke.next.common 包含NextMessage,类似于Android系统的Message类,但是使用更方便,能支持更多数据类型
-
com.mcxiaoke.next.db 包含两个简单的数据库相关的工具类
-
com.mcxiaoke.next.geo 包含LastLocationFinder,用于快速获取上次定位位置
-
com.mcxiaoke.next.io 包含CountingInputStream, CountingOutputStream, StringBuilderWriter, BoundedInputStream等IO数据流相关的封装类,方便使用
-
com.mcxiaoke.next.task 包含异步任务执行模块相关的类,详细的使用见后面的说明
- TaskQueue 核心类,对外接口,支持单例使用
- TaskCallback 回调接口 </ul> </li>
-
com.mcxiaoke.next.utils 包含了很多使用简单但又非常有用的小工具类:
- AndroidUtils Android系统相关的一些工具类,包括文件路径处理,Toast显示,屏幕方向,组件启用禁用,获取App签名信息等
- AssertUtils Assert类,Null检查,对象检查,数组检查等
- BitmapUtils Bitmap缩放,旋转,圆角,阴影,裁剪等方法
- CryptoUtils 加密算法相关的工具方法,支持MD5/SHA1/SHA256/AES/HEX等
- IOUtils IO操作工具类,包含常用的文件复制/字符串/数组/列表/数据流读写方法
- MimeUtils MIME工具类,支持根据文件扩展名获取MIME类型
- NetworkUtils 网络工具类,支持获取网络类型,设置代理等
- ProxyUtils WebView代理设置工具类,这个可能已经失效了
- ReflectionUtils Java反射相关的工具类
- StringUtils 字符串工具类,支持常用的字符串合并/分割/比较/转换/判断等操作
- ViewUtils View相关的几个工具方法,例如getScreenRawSize/getActionBarHeightInDp/getStatusBarHeightInDp/getResourceValue等
- ZipUtils 支持ZIP文件压缩/解压缩 </ul> </li> </ul>
- NextClient 网络组件的核心类
- NextParams HTTP参数封装和处理
- NextRequest HTTP Request
- NextResponse HTTP Response
-
AlertDialogFragment和ProgressDialogFragment 封装好的DialogFragmen,接口简单,同时有4.0版本和使用support-v4的版本
-
EndlessListView 封装的ListView,添加了支持加载更多数据的接口和FooterView展示
-
CheckableFrameLayout Checkable布局系列,包含几种常用布局的Checkable封装,附带一个很有用的CheckableImageView
-
NoPressStateFrameLayout NoPress布局系统,包含几种常用布局的NoPressState封装
-
SquaredFrameLayout Squared布局系列,包含几个常用布局的Squared封装,正方形布局
-
typeface typeface包里包含一些支持字体设置的常用控件,如Button/TextView/CheckBox等
-
AspectRatioImageView 定制的ImageView,缩放时会保持长宽比
-
CircularImageView 圆形ImageView,一般用作头像等显示,不建议使用,github有更好的项目
-
FixedRatioImageView 强制高宽比的ImageView,可选以水平或垂直方向为基准,另外还有一个强制保持正方形的SquaredImageView
-
AdvancedShareActionProvider 高级版的ShareActionProvider,支持自定义分享菜单列表项,自定图标和分享内容等,包含4.0的版本和使用AppCompat的版本,具体可以看源码和示例
-
ArrayAdapterCompat 增强版的ArrayAdapter,支持2.3以上版本,增加很多实用方法
http HTTP组件
包含一个经过简单封装的HTTP操作模块,简化常用的网络请求操作
详细的使用方法见后面的介绍
ui UI组件
一些常用的UI控件,可简化日常开发,包含:
samples 示例
包含几个常用模块的示例,主要是TaskQueue/NextClient/AdvancedShareActionProvider的示例
使用说明
异步任务模块
// you can use TaskCallable or just Callable final TaskCallable<String> callable=new TaskCallable<String>("name") { @Override public String call() throws Exception { final String url="https://github.com/mcxiaoke/Android-Next/raw/master/README.md"; final NextResponse response=NextClient.get(url); return response.string(); } }; // task callback final TaskCallback<String> callback=new SimpleTaskCallback<String>() { @Override public void onTaskStarted(final String tag, final Bundle extras) { // task started, main thread } @Override public void onTaskSuccess(final String value, final Bundle extras) { // task success, main thread mTextView.setText(value); } @Override public void onTaskFailure(final Throwable ex, final Bundle extras) { // task failure, main thread } }; // add task, execute concurrently TaskQueue.getDefault().add(callable,callback,this); // add task, execute serially TaskQueue.getDefault().addSerially(callable, callback, this); // set custom task executor TaskQueue.getDefault().setExecutor(executor); // set yes/no check activity/fragment lifecycle TaskQueue.getDefault().setEnableCallerAliveCheck(true); // save task tag for cancel the task final String tag=TaskQueue.getDefault().add(callable,callback,this); TaskQueue.getDefault().cancel(tag); // cancel the task by caller TaskQueue.getDefault().cancelAll(this); // cancel all task TaskQueue.getDefault().cancelAll();
HTTP模块
final String url = "https://github.com/mcxiaoke/Android-Next/raw/master/README.md"; // simple use // NextResponse response = NextClient.get(url); // advanced use final NextClient client = new NextClient(); final NextRequest request = NextRequest.newBuilder() .url(url) .encoding("UTF-8") .method("POST") .header("X-UDID", "cxgdg4543gd64tgdgs2tgdgst4") .param("image", new File("IMG_20141222.jpg"), "image/jpeg") .param("param1", "value1") // http progress callback, for monitor upload/download file progress .callback(new ProgressCallback() { @Override public void onProgress(final long currentSize, final long totalSize) { Log.v(TAG, "http progress: " + currentSize * 100 / totalSize); } }).build(); final NextResponse response = client.execute(request); // get response meta-data Log.v(TAG, "http response successful: " + response.successful()); Log.v(TAG, "http response statusCode: " + response.code()); Log.v(TAG, "http response statusMessage: " + response.message()); Log.v(TAG, "http response contentLength: " + response.contentLength()); Log.v(TAG, "http response contentType: " + response.contentType()); // get 301/302/30x location header Log.v(TAG, "http response location: " + response.location()); Log.v(TAG, "http response Server:" + response.header("Server")); Log.v(TAG, "http response Connection: " + response.header("Connection")); // get body as string Log.v(TAG, "http response content: " + response.string()); // get body as bytes final byte[] bytes = response.bytes(); final Bitmap bitmap1 = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); // get body as stream final InputStream stream = response.stream(); final Bitmap bitmap2 = BitmapFactory.decodeStream(stream); // get body as reader final InputStreamReader reader = response.reader(Charsets.UTF_8);
缓存模块
// create memory cache, internally using map final IMemoryCache<String, Object> memoryCache = CacheFactory.createCache(); // create memory cache, internally using lru cache // final IMemoryCache<String,Object> memoryCache=CacheFactory.createLruCache(100); memoryCache.put("strKey", "value"); memoryCache.put("intKey", 123); memoryCache.put("boolKey", false); memoryCache.put("objKey", new TaskQueue()); final String value = (String) memoryCache.get("strKey"); final Context context = mockContext(); // default disc cache, use /data/data/package-name/cache/.disc/ dir final DiscCache discCache = new DiscCache(context); // use custom /data/data/package-name/cache/json-cache/ dir //final DiscCache discCache=new DiscCache(context,"json-cache"); // use custom /sdcard/Android/data/package-name/cache/json-cache/ dir //final DiscCache discCache=new DiscCache(context,"json-cache",DiscCache.MODE_EXTERNAL); discCache.setCacheDir("dirName"); discCache.setCharset("UTF-8"); discCache.setFileNameGenerator(nameGenerator); final byte[] bytes = new byte[100]; discCache.put("bytes", bytes); discCache.put("stream", new ByteArrayInputStream(bytes)); discCache.put("text", "some text for cache"); final byte[] bytesValue = discCache.getBytes("bytes"); final File file = discCache.getFile("stream"); final String stringValue = discCache.get("text"); discCache.remove("cacheKey"); discCache.clear(); discCache.delete(new FileFilter() { @Override public boolean accept(final File pathname) { return false; } });