diff --git a/CONTRIBUTING_APP.md b/CONTRIBUTING_APP.md index 72ce51d4f..cc68abbd6 100644 --- a/CONTRIBUTING_APP.md +++ b/CONTRIBUTING_APP.md @@ -21,4 +21,5 @@ * [**MVVMArms** : Android MVVM Architecture Components based on **MVPArms** and **Android Architecture Components**.](https://github.com/xiaobailong24/MVVMArms) * [**smartframework-android-atlas** : 这是一个将 **MVPArms** 框架和 **Atlas** 框架相结合的组件化 **MVP** 框架](https://github.com/smarthane/smartframework-android-atlas) * [**smartframework-android** : 这是一个将 **MVPArms** 框架和 **VirtualAPK** 框架相结合的插件化 **MVP** 框架](https://github.com/smarthane/smartframework-android) +* [**Atoms-mvp** : 这是一个参考 **MVPArms** 框架, 将自己对框架的理解相结合的 **MVP** 框架](https://github.com/xwc520/Atoms-mvp) diff --git a/MVPArms.md b/MVPArms.md index b60d2092d..ee2501e6c 100644 --- a/MVPArms.md +++ b/MVPArms.md @@ -1,8 +1,9 @@ ![Logo](image/arms_banner_v1.0.jpg) +![Official](image/official.jpeg)

- Latest Stable Version + Latest Stable Version Build Status @@ -16,7 +17,7 @@ Author - + QQ Group

@@ -56,21 +57,21 @@ ## Functionality & Libraries 1. [`Mvp` 是 Google 官方出品的 `Mvp` 架构项目,含有多个不同的架构分支(此为 Dagger 分支).](https://github.com/googlesamples/android-architecture/tree/todo-mvp-dagger/) 2. [`Dagger2` 是 Google 根据 Square 的 Dagger1 出品的依赖注入框架,通过 Apt 编译时生成代码,性能优于使用运行时反射技术的依赖注入框架.](https://github.com/google/dagger) -3. [`RxJava` 提供优雅的响应式 Api 解决异步请求以及事件处理.](https://github.com/ReactiveX/RxJava) -4. [`RxAndroid` 为 Android 提供响应式 Api.](https://github.com/ReactiveX/RxAndroid) -5. [`Rxlifecycle`,在 Android 上使用 rxjava 都知道的一个坑,就是生命周期的解除订阅,这个框架通过绑定 Activity 和 Fragment 的生命周期完美解决该问题.](https://github.com/trello/RxLifecycle) -6. [`RxCache` 是使用注解,为 Retrofit 加入二级缓存 (内存,磁盘) 的缓存库.](https://github.com/VictorAlbertos/RxCache) +3. [`RxJava` 提供优雅的响应式 API 解决异步请求以及事件处理.](https://github.com/ReactiveX/RxJava) +4. [`RxAndroid` 为 Android 提供响应式 API.](https://github.com/ReactiveX/RxAndroid) +5. [`Rxlifecycle`,在 Android 上使用 `RxJava` 都知道的一个坑,就是生命周期的解除订阅,这个框架通过绑定 Activity 和 Fragment 的生命周期完美解决该问题.](https://github.com/trello/RxLifecycle) +6. [`RxCache` 是使用注解,为 `Retrofit` 加入二级缓存 (内存,磁盘) 的缓存库.](https://github.com/VictorAlbertos/RxCache) 7. [`RxErroHandler` 是 `RxJava` 的错误处理库,可在出现错误后重试.](https://github.com/JessYanCoding/RxErrorHandler) 8. [`RxPermissions` 用于处理 Android 运行时权限的响应式库.](https://github.com/tbruyelle/RxPermissions) -9. [`Retrofit` 是 Square 出品的网络请求库,极大的减少了 http 请求的代码和步骤.](https://github.com/square/retrofit) -10. [`Okhttp` 同样Square出品,不多介绍,做Android都应该知道.](https://github.com/square/okhttp) -11. [`AndroidAutoSize` 是今日头条屏幕适配方案终极版,一个极低成本的 Android 屏幕适配方案](https://github.com/JessYanCoding/AndroidAutoSize) +9. [`Retrofit` 是 Square 出品的网络请求库,极大的减少了 Http 请求的代码和步骤.](https://github.com/square/retrofit) +10. [`Okhttp` 同样 Square 出品,不多介绍,做 Android 的都应该知道.](https://github.com/square/okhttp) +11. [`AndroidAutoSize` 是今日头条屏幕适配方案终极版,一个极低成本的 Android 屏幕适配方案,该库没有引入到 `Arms`,所以框架使用者可自由选择屏幕适配方案.](https://github.com/JessYanCoding/AndroidAutoSize) 12. [`Gson` 是 Google 官方的 Json Convert 框架.](https://github.com/google/gson) 13. [`Butterknife` 是 JakeWharton 大神出品的 View 注入框架.](https://github.com/JakeWharton/butterknife) -14. [`Androideventbus` 是一个轻量级使用注解的 Eventbus.](https://github.com/hehonghui/AndroidEventBus) -15. [`Timber` 是 JakeWharton 大神出品 Log 框架容器,内部代码极少,但是思想非常不错.](https://github.com/JakeWharton/timber) -16. [`Glide` 是本框架默认封装图片加载库,可参照着例子更改为其他的库,Api 和 `Picasso` 差不多,缓存机制比 `Picasso` 复杂,速度快,适合处理大型图片流,支持 gif 图片,`Fresco` 太大了!在 5.0 以下优势很大,5.0 以上系统默认使用的内存管理和 `Fresco` 类似.](https://github.com/bumptech/glide) -17. [`LeakCanary` 是 Square 出品的专门用来检测 `Android` 和 `Java` 的内存泄漏,通过通知栏提示内存泄漏信息.](https://github.com/square/leakcanary) +14. [`AndroidEventBus` 是一个轻量级的 EventBus,该库没有引入到 `Arms`,所以框架使用者可自由选择 EventBus.](https://github.com/hehonghui/AndroidEventBus) +15. [`Timber` 是 JakeWharton 大神出品的 Log 框架容器,内部代码极少,但是思想非常不错.](https://github.com/JakeWharton/timber) +16. [`Glide` 是本框架默认封装到扩展库 `arms-imageloader-glide` 中的图片加载库,可参照着 Wiki 更改为其他的图片加载库,`Glide` 的 API 和 `Picasso` 差不多,缓存机制比 `Picasso` 复杂,速度快,适合处理大型图片流,支持 gif 图片,`Fresco` 太大了!在 5.0 以下优势很大,5.0 以上系统默认使用的内存管理和 `Fresco` 类似.](https://github.com/bumptech/glide) +17. [`LeakCanary` 是 Square 出品的专门用来检测 `Android` 和 `Java` 的内存泄漏,并通过通知栏提示内存泄漏信息.](https://github.com/square/leakcanary) ## Who is using MVPArms? @@ -80,13 +81,13 @@ 但是 **MVPArms** 远不止于此, 还有更多的路要走, 还会继续成长, 变得更加强大, 现在我们诚挚的邀请您也成为咱们 **MVPArms** 大家庭中的一员 -**小顶家装 工长端** | **小顶家装 工人端** | **小顶家装 材料端** | **小顶网** | **智播** | +**天府通** | **小顶家装 工长端** | **小顶家装 工人端** | **小顶家装 材料端** | **小顶网** | :-------------------------------------------------------------------:|:----------:|:---------------:|:--------:|:--------------:| -[](http://www.dggxdjz.com) | [](http://www.dggxdjz.com) | [](http://www.dggxdjz.com) | [](http://www.dgg.net/appload.htm) | [](http://www.zhibocloud.cn/)| +[](https://android.myapp.com/myapp/detail.htm?apkName=com.chinarainbow.tft) | [](http://www.dggxdjz.com) | [](http://www.dggxdjz.com) | [](http://www.dggxdjz.com) | [](http://www.dgg.net/appload.htm) | **天天视频** | **天天直播** | **中斗通航** | **中斗祥云** | **麋鹿旅行** | -[](http://sj.qq.com/myapp/detail.htm?apkName=com.dzwh.ttys) | [](http://www.25pp.com/android/detail_7611392/) | [](https://fir.im/3176) | | [](http://android.myapp.com/myapp/detail.htm?apkName=com.elk.tourist) | -**汇财富** | **觅窝** | **晒墨宝** | **(In Progress App ...)** | **(Your App ...)** | -[](http://android.myapp.com/myapp/detail.htm?apkName=com.tahone.client) | [](http://miwo.ai/) | [](http://sj.qq.com/myapp/search.htm?kw=%E6%99%92%E5%A2%A8%E5%AE%9D) | | | +[](http://sj.qq.com/myapp/detail.htm?apkName=com.dzwh.ttys) | [](http://www.25pp.com/android/detail_7611392/) | [](https://fir.im/3176) | | [](http://android.myapp.com/myapp/detail.htm?apkName=com.elk.tourist) | +**汇财富** | **觅窝** | **晒墨宝** | **智播** | **(Your App ...)** | +[](http://android.myapp.com/myapp/detail.htm?apkName=com.tahone.client) | [](http://miwo.ai/) | [](http://sj.qq.com/myapp/search.htm?kw=%E6%99%92%E5%A2%A8%E5%AE%9D) | [](http://www.zhibocloud.cn/) | | ## Acknowledgements diff --git a/README.md b/README.md index 2b909d03b..7e01b721c 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ ![Logo](image/arms_banner_v1.0.jpg) +![Official](image/official.jpeg)

- Latest Stable Version + Latest Stable Version Build Status @@ -16,7 +17,7 @@ Author - + QQ Group

@@ -73,20 +74,20 @@ 11. [`AndroidAutoSize`](https://github.com/JessYanCoding/AndroidAutoSize) 12. [`Gson`](https://github.com/google/gson) 13. [`Butterknife`](https://github.com/JakeWharton/butterknife) -14. [`Androideventbus`](https://github.com/hehonghui/AndroidEventBus) +14. [`AndroidEventBus`](https://github.com/hehonghui/AndroidEventBus) 15. [`Timber`](https://github.com/JakeWharton/timber) 16. [`Glide`](https://github.com/bumptech/glide) 17. [`LeakCanary`](https://github.com/square/leakcanary) ## Who is using MVPArms? -**小顶家装 工长端** | **小顶家装 工人端** | **小顶家装 材料端** | **小顶网** | **智播** | +**天府通** | **小顶家装 工长端** | **小顶家装 工人端** | **小顶家装 材料端** | **小顶网** | :-------------------------------------------------------------------:|:----------:|:---------------:|:--------:|:--------------:| -[](http://www.dggxdjz.com) | [](http://www.dggxdjz.com) | [](http://www.dggxdjz.com) | [](http://www.dgg.net/appload.htm) | [](http://www.zhibocloud.cn/)| +[](https://android.myapp.com/myapp/detail.htm?apkName=com.chinarainbow.tft) | [](http://www.dggxdjz.com) | [](http://www.dggxdjz.com) | [](http://www.dggxdjz.com) | [](http://www.dgg.net/appload.htm) | **天天视频** | **天天直播** | **中斗通航** | **中斗祥云** | **麋鹿旅行** | -[](http://sj.qq.com/myapp/detail.htm?apkName=com.dzwh.ttys) | [](http://www.25pp.com/android/detail_7611392/) | [](https://fir.im/3176) | | [](http://android.myapp.com/myapp/detail.htm?apkName=com.elk.tourist) | -**汇财富** | **觅窝** | **晒墨宝** | **(In Progress App ...)** | **(Your App ...)** | -[](http://android.myapp.com/myapp/detail.htm?apkName=com.tahone.client) | [](http://miwo.ai/) | [](http://sj.qq.com/myapp/search.htm?kw=%E6%99%92%E5%A2%A8%E5%AE%9D) | | | +[](http://sj.qq.com/myapp/detail.htm?apkName=com.dzwh.ttys) | [](http://www.25pp.com/android/detail_7611392/) | [](https://fir.im/3176) | | [](http://android.myapp.com/myapp/detail.htm?apkName=com.elk.tourist) | +**汇财富** | **觅窝** | **晒墨宝** | **智播** | **(Your App ...)** | +[](http://android.myapp.com/myapp/detail.htm?apkName=com.tahone.client) | [](http://miwo.ai/) | [](http://sj.qq.com/myapp/search.htm?kw=%E6%99%92%E5%A2%A8%E5%AE%9D) | [](http://www.zhibocloud.cn/) | | ## Acknowledgements diff --git a/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoAppBarLayout.java b/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoAppBarLayout.java index 2a597ee4e..ebcd244f2 100644 --- a/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoAppBarLayout.java +++ b/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoAppBarLayout.java @@ -54,7 +54,6 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } - @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); @@ -65,7 +64,6 @@ public LayoutParams generateLayoutParams(AttributeSet attrs) { return new LayoutParams(getContext(), attrs); } - public static class LayoutParams extends AppBarLayout.LayoutParams implements AutoLayoutHelper.AutoLayoutParams { private AutoLayoutInfo mAutoLayoutInfo; @@ -80,12 +78,10 @@ public AutoLayoutInfo getAutoLayoutInfo() { return mAutoLayoutInfo; } - public LayoutParams(int width, int height) { super(width, height); } - public LayoutParams(ViewGroup.LayoutParams source) { super(source); } @@ -93,7 +89,5 @@ public LayoutParams(ViewGroup.LayoutParams source) { public LayoutParams(ViewGroup.MarginLayoutParams source) { super(source); } - } - } diff --git a/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoCardView.java b/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoCardView.java index aef5a5956..2eda80c40 100644 --- a/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoCardView.java +++ b/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoCardView.java @@ -34,40 +34,31 @@ * Follow me * ================================================ */ -public class AutoCardView extends CardView -{ +public class AutoCardView extends CardView { private final AutoLayoutHelper mHelper = new AutoLayoutHelper(this); - public AutoCardView(Context context) - { + public AutoCardView(Context context) { super(context); } - public AutoCardView(Context context, AttributeSet attrs) - { + public AutoCardView(Context context, AttributeSet attrs) { super(context, attrs); } - public AutoCardView(Context context, AttributeSet attrs, int defStyleAttr) - { + public AutoCardView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override - public AutoFrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs) - { + public AutoFrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs) { return new AutoFrameLayout.LayoutParams(getContext(), attrs); } @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) - { - if (!isInEditMode()) - { + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (!isInEditMode()) { mHelper.adjustChildren(); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } - - } \ No newline at end of file diff --git a/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoCollapsingToolbarLayout.java b/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoCollapsingToolbarLayout.java index 57c5bfce0..541d6515d 100644 --- a/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoCollapsingToolbarLayout.java +++ b/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoCollapsingToolbarLayout.java @@ -57,7 +57,6 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } - @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); @@ -68,7 +67,6 @@ public LayoutParams generateLayoutParams(AttributeSet attrs) { return new LayoutParams(getContext(), attrs); } - public static class LayoutParams extends CollapsingToolbarLayout.LayoutParams implements AutoLayoutHelper.AutoLayoutParams { private AutoLayoutInfo mAutoLayoutInfo; @@ -83,12 +81,10 @@ public AutoLayoutInfo getAutoLayoutInfo() { return mAutoLayoutInfo; } - public LayoutParams(int width, int height) { super(width, height); } - public LayoutParams(ViewGroup.LayoutParams source) { super(source); } @@ -96,7 +92,5 @@ public LayoutParams(ViewGroup.LayoutParams source) { public LayoutParams(ViewGroup.MarginLayoutParams source) { super(source); } - } - } diff --git a/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoRadioGroup.java b/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoRadioGroup.java index c179857bf..d5a25eed0 100644 --- a/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoRadioGroup.java +++ b/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoRadioGroup.java @@ -35,73 +35,58 @@ * Follow me * ================================================ */ -public class AutoRadioGroup extends RadioGroup -{ +public class AutoRadioGroup extends RadioGroup { private AutoLayoutHelper mHelper = new AutoLayoutHelper(this); - public AutoRadioGroup(Context context) - { + public AutoRadioGroup(Context context) { super(context); } - public AutoRadioGroup(Context context, AttributeSet attrs) - { + public AutoRadioGroup(Context context, AttributeSet attrs) { super(context, attrs); } - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) - { + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (!isInEditMode()) mHelper.adjustChildren(); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) - { + protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); } @Override - public LayoutParams generateLayoutParams(AttributeSet attrs) - { + public LayoutParams generateLayoutParams(AttributeSet attrs) { return new LayoutParams(getContext(), attrs); } public static class LayoutParams extends RadioGroup.LayoutParams - implements AutoLayoutHelper.AutoLayoutParams - { + implements AutoLayoutHelper.AutoLayoutParams { private AutoLayoutInfo mAutoLayoutInfo; - public LayoutParams(Context c, AttributeSet attrs) - { + public LayoutParams(Context c, AttributeSet attrs) { super(c, attrs); mAutoLayoutInfo = AutoLayoutHelper.getAutoLayoutInfo(c, attrs); } @Override - public AutoLayoutInfo getAutoLayoutInfo() - { + public AutoLayoutInfo getAutoLayoutInfo() { return mAutoLayoutInfo; } - - public LayoutParams(int width, int height) - { + public LayoutParams(int width, int height) { super(width, height); } - public LayoutParams(ViewGroup.LayoutParams source) - { + public LayoutParams(ViewGroup.LayoutParams source) { super(source); } - public LayoutParams(MarginLayoutParams source) - { + public LayoutParams(MarginLayoutParams source) { super(source); } - } } \ No newline at end of file diff --git a/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoScrollView.java b/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoScrollView.java index ccfbb7471..caa40360d 100644 --- a/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoScrollView.java +++ b/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoScrollView.java @@ -58,19 +58,16 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } - @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); } - @Override public LayoutParams generateLayoutParams(AttributeSet attrs) { return new LayoutParams(getContext(), attrs); } - public static class LayoutParams extends ScrollView.LayoutParams implements AutoLayoutHelper.AutoLayoutParams { private AutoLayoutInfo mAutoLayoutInfo; @@ -85,12 +82,10 @@ public AutoLayoutInfo getAutoLayoutInfo() { return mAutoLayoutInfo; } - public LayoutParams(int width, int height) { super(width, height); } - public LayoutParams(ViewGroup.LayoutParams source) { super(source); } @@ -98,6 +93,5 @@ public LayoutParams(ViewGroup.LayoutParams source) { public LayoutParams(MarginLayoutParams source) { super(source); } - } } diff --git a/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoTabLayout.java b/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoTabLayout.java index f57be46ad..563d7dbe7 100644 --- a/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoTabLayout.java +++ b/arms-autolayout/src/main/java/com/jess/arms/widget/autolayout/AutoTabLayout.java @@ -103,7 +103,6 @@ private void setUpTabTextSize(Tab tab) { ViewGroup tabContainer = (ViewGroup) tabGroup.getChildAt(tab.getPosition()); TextView textView = (TextView) tabContainer.getChildAt(1); - if (AutoUtils.autoed(textView)) { return; } @@ -114,10 +113,7 @@ private void setUpTabTextSize(Tab tab) { autoTextSize = AutoUtils.getPercentHeightSize(mTextSize); } - textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, autoTextSize); } - - } diff --git a/arms-imageloader-glide/build.gradle b/arms-imageloader-glide/build.gradle index f162e2926..a32082da5 100644 --- a/arms-imageloader-glide/build.gradle +++ b/arms-imageloader-glide/build.gradle @@ -24,6 +24,7 @@ dependencies { api(rootProject.ext.dependencies["glide"]) { exclude module: 'support-annotations' exclude module: 'support-fragment' + exclude module: 'animated-vector-drawable' } compileOnly project(':arms') } diff --git a/arms-imageloader-glide/src/main/java/com/jess/arms/http/imageloader/glide/CacheStrategy.java b/arms-imageloader-glide/src/main/java/com/jess/arms/http/imageloader/glide/CacheStrategy.java new file mode 100644 index 000000000..c35ca7d03 --- /dev/null +++ b/arms-imageloader-glide/src/main/java/com/jess/arms/http/imageloader/glide/CacheStrategy.java @@ -0,0 +1,36 @@ +package com.jess.arms.http.imageloader.glide; + +import android.support.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + + +/** + * Incremental change is better than ambitious failure. + * + * @author : MysticCoder + * @date : 2019/4/29 + * @desc :0对应DiskCacheStrategy.all,1对应DiskCacheStrategy.NONE,2对应DiskCacheStrategy.SOURCE,3对应DiskCacheStrategy.RESULT + * see {@link com.bumptech.glide.load.engine.DiskCacheStrategy} + */ + +public interface CacheStrategy { + + + + int ALL = 0; + + int NONE = 1; + + int RESOURCE = 2; + + int DATA = 3; + + int AUTOMATIC = 4; + + @IntDef({ALL,NONE,RESOURCE,DATA,AUTOMATIC}) + @Retention(RetentionPolicy.SOURCE) + @interface Strategy{} + +} \ No newline at end of file diff --git a/arms-imageloader-glide/src/main/java/com/jess/arms/http/imageloader/glide/GlideImageLoaderStrategy.java b/arms-imageloader-glide/src/main/java/com/jess/arms/http/imageloader/glide/GlideImageLoaderStrategy.java index f3b5f9ac9..3782987ed 100644 --- a/arms-imageloader-glide/src/main/java/com/jess/arms/http/imageloader/glide/GlideImageLoaderStrategy.java +++ b/arms-imageloader-glide/src/main/java/com/jess/arms/http/imageloader/glide/GlideImageLoaderStrategy.java @@ -17,6 +17,8 @@ import android.content.Context; import android.graphics.drawable.Drawable; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.widget.ImageView; import com.bumptech.glide.Glide; @@ -49,7 +51,7 @@ public class GlideImageLoaderStrategy implements BaseImageLoaderStrategy, GlideAppliesOptions { @Override - public void loadImage(Context ctx, ImageConfigImpl config) { + public void loadImage(@Nullable Context ctx, @Nullable ImageConfigImpl config) { Preconditions.checkNotNull(ctx, "Context is required"); Preconditions.checkNotNull(config, "ImageConfigImpl is required"); Preconditions.checkNotNull(config.getImageView(), "ImageView is required"); @@ -61,19 +63,19 @@ public void loadImage(Context ctx, ImageConfigImpl config) { GlideRequest glideRequest = requests.load(config.getUrl()); switch (config.getCacheStrategy()) {//缓存策略 - case 0: + case CacheStrategy.ALL: glideRequest.diskCacheStrategy(DiskCacheStrategy.ALL); break; - case 1: + case CacheStrategy.NONE: glideRequest.diskCacheStrategy(DiskCacheStrategy.NONE); break; - case 2: + case CacheStrategy.RESOURCE: glideRequest.diskCacheStrategy(DiskCacheStrategy.RESOURCE); break; - case 3: + case CacheStrategy.DATA: glideRequest.diskCacheStrategy(DiskCacheStrategy.DATA); break; - case 4: + case CacheStrategy.AUTOMATIC: glideRequest.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC); break; default: @@ -114,13 +116,12 @@ public void loadImage(Context ctx, ImageConfigImpl config) { if (config.getFallback() != 0)//设置请求 url 为空图片 glideRequest.fallback(config.getFallback()); - glideRequest .into(config.getImageView()); } @Override - public void clear(final Context ctx, ImageConfigImpl config) { + public void clear(@Nullable final Context ctx, @Nullable ImageConfigImpl config) { Preconditions.checkNotNull(ctx, "Context is required"); Preconditions.checkNotNull(config, "ImageConfigImpl is required"); @@ -154,7 +155,7 @@ public void run() throws Exception { } @Override - public void applyGlideOptions(Context context, GlideBuilder builder) { - Timber.w("applyGlideOptions"); + public void applyGlideOptions(@NonNull Context context, @NonNull GlideBuilder builder) { + Timber.i("applyGlideOptions"); } } diff --git a/arms-imageloader-glide/src/main/java/com/jess/arms/http/imageloader/glide/ImageConfigImpl.java b/arms-imageloader-glide/src/main/java/com/jess/arms/http/imageloader/glide/ImageConfigImpl.java index fdf1dc306..d2b4af5d8 100644 --- a/arms-imageloader-glide/src/main/java/com/jess/arms/http/imageloader/glide/ImageConfigImpl.java +++ b/arms-imageloader-glide/src/main/java/com/jess/arms/http/imageloader/glide/ImageConfigImpl.java @@ -34,7 +34,7 @@ * ================================================ */ public class ImageConfigImpl extends ImageConfig { - private int cacheStrategy;//0对应DiskCacheStrategy.all,1对应DiskCacheStrategy.NONE,2对应DiskCacheStrategy.SOURCE,3对应DiskCacheStrategy.RESULT + private @CacheStrategy.Strategy int cacheStrategy;//0对应DiskCacheStrategy.all,1对应DiskCacheStrategy.NONE,2对应DiskCacheStrategy.SOURCE,3对应DiskCacheStrategy.RESULT private int fallback; //请求 url 为空,则使用此图片作为占位符 private int imageRadius;//图片每个圆角的大小 private int blurValue;//高斯模糊值, 值越大模糊效果越大 @@ -68,7 +68,7 @@ private ImageConfigImpl(Builder builder) { this.isClearDiskCache = builder.isClearDiskCache; } - public int getCacheStrategy() { + public @CacheStrategy.Strategy int getCacheStrategy() { return cacheStrategy; } @@ -124,14 +124,13 @@ public static Builder builder() { return new Builder(); } - public static final class Builder { private String url; private ImageView imageView; private int placeholder; private int errorPic; private int fallback; //请求 url 为空,则使用此图片作为占位符 - private int cacheStrategy;//0对应DiskCacheStrategy.all,1对应DiskCacheStrategy.NONE,2对应DiskCacheStrategy.SOURCE,3对应DiskCacheStrategy.RESULT + private @CacheStrategy.Strategy int cacheStrategy;//0对应DiskCacheStrategy.all,1对应DiskCacheStrategy.NONE,2对应DiskCacheStrategy.SOURCE,3对应DiskCacheStrategy.RESULT private int imageRadius;//图片每个圆角的大小 private int blurValue;//高斯模糊值, 值越大模糊效果越大 /** @@ -174,7 +173,7 @@ public Builder imageView(ImageView imageView) { return this; } - public Builder cacheStrategy(int cacheStrategy) { + public Builder cacheStrategy(@CacheStrategy.Strategy int cacheStrategy) { this.cacheStrategy = cacheStrategy; return this; } @@ -236,7 +235,6 @@ public Builder isClearDiskCache(boolean isClearDiskCache) { return this; } - public ImageConfigImpl build() { return new ImageConfigImpl(this); } diff --git a/arms/build.gradle b/arms/build.gradle index aba14dec4..0f3f928d4 100644 --- a/arms/build.gradle +++ b/arms/build.gradle @@ -92,7 +92,7 @@ dependencies { exclude module: 'retrofit' exclude module: 'okio' } - api rootProject.ext.dependencies["okhttp3"] + api rootProject.ext.dependencies["okhttp4"] compileOnly rootProject.ext.dependencies["glide"] annotationProcessor(rootProject.ext.dependencies["glide-compiler"]) { exclude module: 'jsr305' diff --git a/arms/proguard-rules.pro b/arms/proguard-rules.pro index 348a7670b..5d75af25a 100644 --- a/arms/proguard-rules.pro +++ b/arms/proguard-rules.pro @@ -130,6 +130,18 @@ } -keepattributes *Annotation* + +################EventBus############### +-keepclassmembers class * { + @org.greenrobot.eventbus.Subscribe ; +} +-keep class org.greenrobot.eventbus.EventBus { *; } +-keep enum org.greenrobot.eventbus.ThreadMode { *; } + +-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { + (java.lang.Throwable); +} + ################autolayout############### -keep class com.zhy.autolayout.** { *; } -keep interface com.zhy.autolayout.** { *; } diff --git a/arms/src/main/java/com/jess/arms/base/AdapterViewPager.java b/arms/src/main/java/com/jess/arms/base/AdapterViewPager.java index dbd2fd0f5..1fb5678bd 100644 --- a/arms/src/main/java/com/jess/arms/base/AdapterViewPager.java +++ b/arms/src/main/java/com/jess/arms/base/AdapterViewPager.java @@ -39,7 +39,6 @@ public AdapterViewPager(FragmentManager fragmentManager, List list) { this.mList = list; } - public AdapterViewPager(FragmentManager fragmentManager, List list, CharSequence[] titles) { super(fragmentManager); this.mList = list; diff --git a/arms/src/main/java/com/jess/arms/base/BaseActivity.java b/arms/src/main/java/com/jess/arms/base/BaseActivity.java index e02231b89..0e204cf50 100644 --- a/arms/src/main/java/com/jess/arms/base/BaseActivity.java +++ b/arms/src/main/java/com/jess/arms/base/BaseActivity.java @@ -20,6 +20,7 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; import android.util.AttributeSet; import android.view.InflateException; @@ -122,7 +123,7 @@ protected void onDestroy() { * 确保依赖后, 将此方法返回 true, Arms 会自动检测您依赖的 EventBus, 并自动注册 * 这种做法可以让使用者有自行选择三方库的权利, 并且还可以减轻 Arms 的体积 * - * @return 返回 {@code true} (默认为使用 {@code true}), Arms 会自动注册 EventBus + * @return 返回 {@code true} (默认为 {@code true}), Arms 会自动注册 EventBus */ @Override public boolean useEventBus() { @@ -130,10 +131,10 @@ public boolean useEventBus() { } /** - * 这个Activity是否会使用Fragment,框架会根据这个属性判断是否注册{@link android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks} - * 如果返回false,那意味着这个Activity不需要绑定Fragment,那你再在这个Activity中绑定继承于 {@link com.jess.arms.base.BaseFragment} 的Fragment将不起任何作用 + * 这个 {@link Activity} 是否会使用 {@link Fragment}, 框架会根据这个属性判断是否注册 {@link android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks} + * 如果返回 {@code false}, 那意味着这个 {@link Activity} 不需要绑定 {@link Fragment}, 那你再在这个 {@link Activity} 中绑定继承于 {@link BaseFragment} 的 {@link Fragment} 将不起任何作用 * - * @return + * @return 返回 {@code true} (默认为 {@code true}), 则需要使用 {@link Fragment} */ @Override public boolean useFragment() { diff --git a/arms/src/main/java/com/jess/arms/base/BaseApplication.java b/arms/src/main/java/com/jess/arms/base/BaseApplication.java index a7e58086e..5d4736269 100644 --- a/arms/src/main/java/com/jess/arms/base/BaseApplication.java +++ b/arms/src/main/java/com/jess/arms/base/BaseApplication.java @@ -87,5 +87,4 @@ public AppComponent getAppComponent() { Preconditions.checkState(mAppDelegate instanceof App, "%s must be implements %s", mAppDelegate.getClass().getName(), App.class.getName()); return ((App) mAppDelegate).getAppComponent(); } - } diff --git a/arms/src/main/java/com/jess/arms/base/BaseFragment.java b/arms/src/main/java/com/jess/arms/base/BaseFragment.java index c6e699fe8..f910ac95a 100644 --- a/arms/src/main/java/com/jess/arms/base/BaseFragment.java +++ b/arms/src/main/java/com/jess/arms/base/BaseFragment.java @@ -107,11 +107,10 @@ public void onDetach() { * 确保依赖后, 将此方法返回 true, Arms 会自动检测您依赖的 EventBus, 并自动注册 * 这种做法可以让使用者有自行选择三方库的权利, 并且还可以减轻 Arms 的体积 * - * @return 返回 {@code true} (默认为使用 {@code true}), Arms 会自动注册 EventBus + * @return 返回 {@code true} (默认为 {@code true}), Arms 会自动注册 EventBus */ @Override public boolean useEventBus() { return true; } - } diff --git a/arms/src/main/java/com/jess/arms/base/BaseHolder.java b/arms/src/main/java/com/jess/arms/base/BaseHolder.java index f282cb554..de6e7798e 100644 --- a/arms/src/main/java/com/jess/arms/base/BaseHolder.java +++ b/arms/src/main/java/com/jess/arms/base/BaseHolder.java @@ -15,6 +15,7 @@ */ package com.jess.arms.base; +import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.View; @@ -36,20 +37,21 @@ public abstract class BaseHolder extends RecyclerView.ViewHolder implements V public BaseHolder(View itemView) { super(itemView); - itemView.setOnClickListener(this);//点击事件 - if (ThirdViewUtil.isUseAutolayout()) AutoUtils.autoSize(itemView);//适配 - ThirdViewUtil.bindTarget(this, itemView);//绑定 + //点击事件 + itemView.setOnClickListener(this); + //屏幕适配 + if (ThirdViewUtil.isUseAutolayout()) AutoUtils.autoSize(itemView); + //绑定 ButterKnife + ThirdViewUtil.bindTarget(this, itemView); } - /** * 设置数据 * - * @param data - * @param position + * @param data 数据 + * @param position 在 RecyclerView 中的位置 */ - public abstract void setData(T data, int position); - + public abstract void setData(@NonNull T data, int position); /** * 在 Activity 的 onDestroy 中使用 {@link DefaultAdapter#releaseAllHolder(RecyclerView)} 方法 (super.onDestroy() 之前) @@ -66,11 +68,21 @@ public void onClick(View view) { } } + /** + * item 点击事件 + */ public interface OnViewClickListener { + + /** + * item 被点击 + * + * @param view 被点击的 {@link View} + * @param position 在 RecyclerView 中的位置 + */ void onViewClick(View view, int position); } public void setOnItemClickListener(OnViewClickListener listener) { this.mOnViewClickListener = listener; } -} +} \ No newline at end of file diff --git a/arms/src/main/java/com/jess/arms/base/BaseLazyLoadFragment.java b/arms/src/main/java/com/jess/arms/base/BaseLazyLoadFragment.java new file mode 100644 index 000000000..440a6e642 --- /dev/null +++ b/arms/src/main/java/com/jess/arms/base/BaseLazyLoadFragment.java @@ -0,0 +1,73 @@ +package com.jess.arms.base; + +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; + +import com.jess.arms.mvp.IPresenter; + +import java.util.List; + +/** + * 子类覆写{@link BaseLazyLoadFragment}lazyLoadData可快速实现Fragment懒加载 + */ +public abstract class BaseLazyLoadFragment

extends BaseFragment

{ + + private boolean isViewCreated; // 界面是否已创建完成 + private boolean isVisibleToUser; // 是否对用户可见 + private boolean isDataLoaded; // 数据是否已请求 + + /** + * 第一次可见时触发调用,此处实现具体的数据请求逻辑 + */ + protected abstract void lazyLoadData(); + + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + this.isVisibleToUser = isVisibleToUser; + tryLoadData(); + } + + /** + * 保证在initData后触发 + */ + @Override + public void onResume() { + super.onResume(); + isViewCreated = true; + tryLoadData(); + } + + /** + * ViewPager场景下,判断父fragment是否可见 + */ + private boolean isParentVisible() { + Fragment fragment = getParentFragment(); + return fragment == null || (fragment instanceof BaseLazyLoadFragment && ((BaseLazyLoadFragment) fragment).isVisibleToUser); + } + + /** + * ViewPager场景下,当前fragment可见时,如果其子fragment也可见,则让子fragment请求数据 + */ + private void dispatchParentVisibleState() { + FragmentManager fragmentManager = getChildFragmentManager(); + List fragments = fragmentManager.getFragments(); + if (fragments.isEmpty()) { + return; + } + for (Fragment child : fragments) { + if (child instanceof BaseLazyLoadFragment && ((BaseLazyLoadFragment) child).isVisibleToUser) { + ((BaseLazyLoadFragment) child).tryLoadData(); + } + } + } + + public void tryLoadData() { + if (isViewCreated && isVisibleToUser && isParentVisible() && !isDataLoaded) { + lazyLoadData(); + isDataLoaded = true; + //通知子Fragment请求数据 + dispatchParentVisibleState(); + } + } +} diff --git a/arms/src/main/java/com/jess/arms/base/BaseService.java b/arms/src/main/java/com/jess/arms/base/BaseService.java index 7f288f531..e18588475 100644 --- a/arms/src/main/java/com/jess/arms/base/BaseService.java +++ b/arms/src/main/java/com/jess/arms/base/BaseService.java @@ -68,7 +68,7 @@ public void onDestroy() { * 确保依赖后, 将此方法返回 true, Arms 会自动检测您依赖的 EventBus, 并自动注册 * 这种做法可以让使用者有自行选择三方库的权利, 并且还可以减轻 Arms 的体积 * - * @return 返回 {@code true} (默认为使用 {@code true}), Arms 会自动注册 EventBus + * @return 返回 {@code true} (默认为 {@code true}), Arms 会自动注册 EventBus */ public boolean useEventBus() { return true; @@ -78,12 +78,12 @@ protected void addDispose(Disposable disposable) { if (mCompositeDisposable == null) { mCompositeDisposable = new CompositeDisposable(); } - mCompositeDisposable.add(disposable);//将所有subscription放入,集中处理 + mCompositeDisposable.add(disposable);//将所有 Disposable 放入容器集中处理 } protected void unDispose() { if (mCompositeDisposable != null) { - mCompositeDisposable.clear();//保证activity结束时取消所有正在执行的订阅 + mCompositeDisposable.clear();//保证 Activity 结束时取消所有正在执行的订阅 } } diff --git a/arms/src/main/java/com/jess/arms/base/DefaultAdapter.java b/arms/src/main/java/com/jess/arms/base/DefaultAdapter.java index 665d5c628..9577d951f 100644 --- a/arms/src/main/java/com/jess/arms/base/DefaultAdapter.java +++ b/arms/src/main/java/com/jess/arms/base/DefaultAdapter.java @@ -15,6 +15,7 @@ */ package com.jess.arms.base; +import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; @@ -24,7 +25,7 @@ /** * ================================================ - * 基类 {@link RecyclerView.Adapter} ,如果需要实现非常复杂的 {@link RecyclerView} ,请尽量使用其他优秀的三方库 + * 基类 {@link RecyclerView.Adapter}, 如果需要实现非常复杂的 {@link RecyclerView}, 请尽量使用其他优秀的三方库 *

* Created by jess on 2015/11/27. * Contact me @@ -44,15 +45,16 @@ public DefaultAdapter(List infos) { /** * 创建 {@link BaseHolder} * - * @param parent - * @param viewType - * @return + * @param parent 父容器 + * @param viewType 布局类型 + * @return {@link BaseHolder} */ @Override public BaseHolder onCreateViewHolder(ViewGroup parent, final int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(viewType), parent, false); mHolder = getHolder(view, viewType); - mHolder.setOnItemClickListener(new BaseHolder.OnViewClickListener() {//设置Item点击事件 + //设置Item点击事件 + mHolder.setOnItemClickListener(new BaseHolder.OnViewClickListener() { @Override public void onViewClick(View view, int position) { if (mOnItemClickListener != null && mInfos.size() > 0) { @@ -66,35 +68,38 @@ public void onViewClick(View view, int position) { /** * 绑定数据 * - * @param holder - * @param position + * @param holder {@link BaseHolder} + * @param position 在 RecyclerView 中的位置 */ @Override public void onBindViewHolder(BaseHolder holder, int position) { holder.setData(mInfos.get(position), position); } - /** - * 返回数据的个数 + * 返回数据总个数 * - * @return + * @return 数据总个数 */ @Override public int getItemCount() { return mInfos.size(); } - + /** + * 返回数据集合 + * + * @return 数据集合 + */ public List getInfos() { return mInfos; } /** - * 获得某个 {@code position} 上的 item 的数据 + * 获得 RecyclerView 中某个 position 上的 item 数据 * - * @param position - * @return + * @param position 在 RecyclerView 中的位置 + * @return 数据 */ public T getItem(int position) { return mInfos == null ? null : mInfos.get(position); @@ -103,25 +108,25 @@ public T getItem(int position) { /** * 让子类实现用以提供 {@link BaseHolder} * - * @param v - * @param viewType - * @return + * @param v 用于展示的 {@link View} + * @param viewType 布局类型 + * @return {@link BaseHolder} */ - public abstract BaseHolder getHolder(View v, int viewType); + @NonNull + public abstract BaseHolder getHolder(@NonNull View v, int viewType); /** - * 提供用于 {@code item} 布局的 {@code layoutId} + * 提供用于 item 布局的 {@code layoutId} * - * @param viewType - * @return + * @param viewType 布局类型 + * @return 布局 id */ public abstract int getLayoutId(int viewType); - /** - * 遍历所有{@link BaseHolder},释放他们需要释放的资源 + * 遍历所有 {@link BaseHolder}, 释放他们需要释放的资源 * - * @param recyclerView + * @param recyclerView {@link RecyclerView} */ public static void releaseAllHolder(RecyclerView recyclerView) { if (recyclerView == null) return; @@ -134,11 +139,26 @@ public static void releaseAllHolder(RecyclerView recyclerView) { } } - + /** + * item 点击事件 + * @param + */ public interface OnRecyclerViewItemClickListener { - void onItemClick(View view, int viewType, T data, int position); + + /** + * item 被点击 + * @param view 被点击的 {@link View} + * @param viewType 布局类型 + * @param data 数据 + * @param position 在 RecyclerView 中的位置 + */ + void onItemClick(@NonNull View view, int viewType, @NonNull T data, int position); } + /** + * 设置 item 点击事件 + * @param listener + */ public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.mOnItemClickListener = listener; } diff --git a/arms/src/main/java/com/jess/arms/base/delegate/ActivityDelegateImpl.java b/arms/src/main/java/com/jess/arms/base/delegate/ActivityDelegateImpl.java index dce05c597..8f6acbfa9 100644 --- a/arms/src/main/java/com/jess/arms/base/delegate/ActivityDelegateImpl.java +++ b/arms/src/main/java/com/jess/arms/base/delegate/ActivityDelegateImpl.java @@ -41,7 +41,6 @@ public ActivityDelegateImpl(@NonNull Activity activity) { this.iActivity = (IActivity) activity; } - @Override public void onCreate(@Nullable Bundle savedInstanceState) { //如果要使用 EventBus 请将此方法返回 true diff --git a/arms/src/main/java/com/jess/arms/base/delegate/AppDelegate.java b/arms/src/main/java/com/jess/arms/base/delegate/AppDelegate.java index e4e43e93c..1777b9ada 100644 --- a/arms/src/main/java/com/jess/arms/base/delegate/AppDelegate.java +++ b/arms/src/main/java/com/jess/arms/base/delegate/AppDelegate.java @@ -135,10 +135,8 @@ public void onCreate(@NonNull Application application) { for (AppLifecycles lifecycle : mAppLifecycles) { lifecycle.onCreate(mApplication); } - } - @Override public void onTerminate(@NonNull Application application) { if (mActivityLifecycle != null) { @@ -169,7 +167,6 @@ public void onTerminate(@NonNull Application application) { this.mApplication = null; } - /** * 将app的全局配置信息封装进module(使用Dagger注入到需要配置信息的地方) * 需要在AndroidManifest中声明{@link ConfigModule}的实现类,和Glide的配置方式相似 @@ -177,7 +174,6 @@ public void onTerminate(@NonNull Application application) { * @return GlobalConfigModule */ private GlobalConfigModule getGlobalConfigModule(Context context, List modules) { - GlobalConfigModule.Builder builder = GlobalConfigModule .builder(); @@ -189,7 +185,6 @@ private GlobalConfigModule getGlobalConfigModule(Context context, List provideExtras(Cache.Factory cacheFactory) { @Singleton @Provides - static List provideFragmentLifecycles(){ + static List provideFragmentLifecycles() { return new ArrayList<>(); } public interface GsonConfiguration { - void configGson(Context context, GsonBuilder builder); + void configGson(@NonNull Context context, @NonNull GsonBuilder builder); } } diff --git a/arms/src/main/java/com/jess/arms/di/module/ClientModule.java b/arms/src/main/java/com/jess/arms/di/module/ClientModule.java index e6c304747..420f3b3a3 100644 --- a/arms/src/main/java/com/jess/arms/di/module/ClientModule.java +++ b/arms/src/main/java/com/jess/arms/di/module/ClientModule.java @@ -17,23 +17,28 @@ import android.app.Application; import android.content.Context; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; + import com.google.gson.Gson; import com.jess.arms.http.GlobalHttpHandler; import com.jess.arms.http.log.RequestInterceptor; import com.jess.arms.utils.DataHelper; -import dagger.Binds; -import dagger.Module; -import dagger.Provides; -import io.rx_cache2.internal.RxCache; -import io.victoralbertos.jolyglot.GsonSpeaker; + import java.io.File; import java.io.IOException; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; + import javax.inject.Named; import javax.inject.Singleton; + +import dagger.Binds; +import dagger.Module; +import dagger.Provides; +import io.rx_cache2.internal.RxCache; +import io.victoralbertos.jolyglot.GsonSpeaker; import me.jessyan.rxerrorhandler.core.RxErrorHandler; import me.jessyan.rxerrorhandler.handler.listener.ResponseErrorListener; import okhttp3.Dispatcher; @@ -61,12 +66,12 @@ public abstract class ClientModule { /** * 提供 {@link Retrofit} * - * @param application - * @param configuration - * @param builder - * @param client - * @param httpUrl - * @param gson + * @param application {@link Application} + * @param configuration {@link RetrofitConfiguration} + * @param builder {@link Retrofit.Builder} + * @param client {@link OkHttpClient} + * @param httpUrl {@link HttpUrl} + * @param gson {@link Gson} * @return {@link Retrofit} */ @Singleton @@ -75,13 +80,13 @@ static Retrofit provideRetrofit(Application application, @Nullable RetrofitConfi , HttpUrl httpUrl, Gson gson) { builder .baseUrl(httpUrl)//域名 - .client(client);//设置okhttp + .client(client);//设置 OkHttp if (configuration != null) configuration.configRetrofit(application, builder); builder - .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//使用 Rxjava + .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//使用 RxJava .addConverterFactory(GsonConverterFactory.create(gson));//使用 Gson return builder.build(); } @@ -89,12 +94,13 @@ static Retrofit provideRetrofit(Application application, @Nullable RetrofitConfi /** * 提供 {@link OkHttpClient} * - * @param application - * @param configuration - * @param builder - * @param intercept - * @param interceptors - * @param handler + * @param application {@link Application} + * @param configuration {@link OkhttpConfiguration} + * @param builder {@link OkHttpClient.Builder} + * @param intercept {@link Interceptor} + * @param interceptors {@link List} + * @param handler {@link GlobalHttpHandler} + * @param executorService {@link ExecutorService} * @return {@link OkHttpClient} */ @Singleton @@ -114,13 +120,14 @@ public Response intercept(Chain chain) throws IOException { } }); - if (interceptors != null) {//如果外部提供了interceptor的集合则遍历添加 + //如果外部提供了 Interceptor 的集合则遍历添加 + if (interceptors != null) { for (Interceptor interceptor : interceptors) { builder.addInterceptor(interceptor); } } - // 为 OkHttp 设置默认的线程池。 + //为 OkHttp 设置默认的线程池 builder.dispatcher(new Dispatcher(executorService)); if (configuration != null) @@ -146,9 +153,10 @@ static OkHttpClient.Builder provideClientBuilder() { /** * 提供 {@link RxCache} * - * @param application - * @param configuration - * @param cacheDirectory cacheDirectory RxCache缓存路径 + * @param application {@link Application} + * @param configuration {@link RxCacheConfiguration} + * @param cacheDirectory RxCache 缓存路径 + * @param gson {@link Gson} * @return {@link RxCache} */ @Singleton @@ -166,9 +174,9 @@ static RxCache provideRxCache(Application application, @Nullable RxCacheConfigur } /** - * 需要单独给 {@link RxCache} 提供缓存路径 + * 需要单独给 {@link RxCache} 提供子缓存文件 * - * @param cacheDir + * @param cacheDir 框架缓存文件 * @return {@link File} */ @Singleton @@ -182,8 +190,8 @@ static File provideRxCacheDirectory(File cacheDir) { /** * 提供处理 RxJava 错误的管理器 * - * @param application - * @param listener + * @param application {@link Application} + * @param listener {@link ResponseErrorListener} * @return {@link RxErrorHandler} */ @Singleton @@ -196,23 +204,32 @@ static RxErrorHandler proRxErrorHandler(Application application, ResponseErrorLi .build(); } + /** + * {@link Retrofit} 自定义配置接口 + */ public interface RetrofitConfiguration { - void configRetrofit(Context context, Retrofit.Builder builder); + void configRetrofit(@NonNull Context context, @NonNull Retrofit.Builder builder); } + /** + * {@link OkHttpClient} 自定义配置接口 + */ public interface OkhttpConfiguration { - void configOkhttp(Context context, OkHttpClient.Builder builder); + void configOkhttp(@NonNull Context context, @NonNull OkHttpClient.Builder builder); } + /** + * {@link RxCache} 自定义配置接口 + */ public interface RxCacheConfiguration { /** - * 若想自定义 RxCache 的缓存文件夹或者解析方式, 如改成 fastjson + * 若想自定义 RxCache 的缓存文件夹或者解析方式, 如改成 FastJson * 请 {@code return rxCacheBuilder.persistence(cacheDirectory, new FastJsonSpeaker());}, 否则请 {@code return null;} * - * @param context - * @param builder + * @param context {@link Context} + * @param builder {@link RxCache.Builder} * @return {@link RxCache} */ - RxCache configRxCache(Context context, RxCache.Builder builder); + RxCache configRxCache(@NonNull Context context, @NonNull RxCache.Builder builder); } } diff --git a/arms/src/main/java/com/jess/arms/di/module/GlobalConfigModule.java b/arms/src/main/java/com/jess/arms/di/module/GlobalConfigModule.java index 2824483ba..91b21cd9c 100644 --- a/arms/src/main/java/com/jess/arms/di/module/GlobalConfigModule.java +++ b/arms/src/main/java/com/jess/arms/di/module/GlobalConfigModule.java @@ -19,6 +19,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; + import com.bumptech.glide.Glide; import com.jess.arms.http.BaseUrl; import com.jess.arms.http.GlobalHttpHandler; @@ -32,8 +33,7 @@ import com.jess.arms.integration.cache.LruCache; import com.jess.arms.utils.DataHelper; import com.jess.arms.utils.Preconditions; -import dagger.Module; -import dagger.Provides; + import java.io.File; import java.util.ArrayList; import java.util.List; @@ -42,7 +42,11 @@ import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; + import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; import me.jessyan.rxerrorhandler.handler.listener.ResponseErrorListener; import okhttp3.HttpUrl; import okhttp3.Interceptor; @@ -98,7 +102,6 @@ public static Builder builder() { return new Builder(); } - @Singleton @Provides @Nullable @@ -106,7 +109,6 @@ List provideInterceptors() { return mInterceptors; } - /** * 提供 BaseUrl,默认使用 <"https://api.github.com/"> * @@ -124,7 +126,6 @@ HttpUrl provideBaseUrl() { return mApiUrl == null ? HttpUrl.parse("https://api.github.com/") : mApiUrl; } - /** * 提供图片加载框架,默认使用 {@link Glide} * @@ -137,7 +138,6 @@ BaseImageLoaderStrategy provideImageLoaderStrategy() { return mLoaderStrategy; } - /** * 提供处理 Http 请求和响应结果的处理类 * @@ -150,7 +150,6 @@ GlobalHttpHandler provideGlobalHttpHandler() { return mHandler; } - /** * 提供缓存文件 */ @@ -160,7 +159,6 @@ File provideCacheFile(Application application) { return mCacheFile == null ? DataHelper.getCacheFile(application) : mCacheFile; } - /** * 提供处理 RxJava 错误的管理器的回调 * @@ -172,7 +170,6 @@ ResponseErrorListener provideResponseErrorListener() { return mErrorListener == null ? ResponseErrorListener.EMPTY : mErrorListener; } - @Singleton @Provides @Nullable @@ -209,7 +206,7 @@ RequestInterceptor.Level providePrintHttpLogLevel() { @Singleton @Provides - FormatPrinter provideFormatPrinter(){ + FormatPrinter provideFormatPrinter() { return mFormatPrinter == null ? new DefaultFormatPrinter() : mFormatPrinter; } @@ -222,7 +219,7 @@ Cache.Factory provideCacheFactory(Application application) { public Cache build(CacheType type) { //若想自定义 LruCache 的 size, 或者不想使用 LruCache, 想使用自己自定义的策略 //使用 GlobalConfigModule.Builder#cacheFactory() 即可扩展 - switch (type.getCacheTypeId()){ + switch (type.getCacheTypeId()) { //Activity、Fragment 以及 Extras 使用 IntelligentCache (具有 LruCache 和 可永久存储数据的 Map) case CacheType.EXTRAS_TYPE_ID: case CacheType.ACTIVITY_CACHE_TYPE_ID: @@ -249,7 +246,6 @@ ExecutorService provideExecutorService() { new SynchronousQueue(), Util.threadFactory("Arms Executor", false)) : mExecutorService; } - public static final class Builder { private HttpUrl apiUrl; private BaseUrl baseUrl; @@ -300,13 +296,11 @@ public Builder addInterceptor(Interceptor interceptor) {//动态添加任意个i return this; } - public Builder responseErrorListener(ResponseErrorListener listener) {//处理所有RxJava的onError逻辑 this.responseErrorListener = listener; return this; } - public Builder cacheFile(File cacheFile) { this.cacheFile = cacheFile; return this; @@ -337,7 +331,7 @@ public Builder printHttpLogLevel(RequestInterceptor.Level printHttpLogLevel) {// return this; } - public Builder formatPrinter(FormatPrinter formatPrinter){ + public Builder formatPrinter(FormatPrinter formatPrinter) { this.formatPrinter = Preconditions.checkNotNull(formatPrinter, FormatPrinter.class.getCanonicalName() + "can not be null."); return this; } @@ -355,9 +349,5 @@ public Builder executorService(ExecutorService executorService) { public GlobalConfigModule build() { return new GlobalConfigModule(this); } - - } - - } diff --git a/arms/src/main/java/com/jess/arms/http/BaseUrl.java b/arms/src/main/java/com/jess/arms/http/BaseUrl.java index 56495e7ca..be68196ce 100644 --- a/arms/src/main/java/com/jess/arms/http/BaseUrl.java +++ b/arms/src/main/java/com/jess/arms/http/BaseUrl.java @@ -15,6 +15,8 @@ */ package com.jess.arms.http; +import android.support.annotation.NonNull; + import okhttp3.HttpUrl; /** @@ -32,5 +34,6 @@ public interface BaseUrl { * * @return */ + @NonNull HttpUrl url(); } diff --git a/arms/src/main/java/com/jess/arms/http/GlobalHttpHandler.java b/arms/src/main/java/com/jess/arms/http/GlobalHttpHandler.java index 13d8d4b71..6929b5a70 100644 --- a/arms/src/main/java/com/jess/arms/http/GlobalHttpHandler.java +++ b/arms/src/main/java/com/jess/arms/http/GlobalHttpHandler.java @@ -15,6 +15,9 @@ */ package com.jess.arms.http; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + import com.jess.arms.di.module.GlobalConfigModule; import okhttp3.Interceptor; @@ -33,23 +36,46 @@ * ================================================ */ public interface GlobalHttpHandler { - Response onHttpResultResponse(String httpResult, Interceptor.Chain chain, Response response); - Request onHttpRequestBefore(Interceptor.Chain chain, Request request); + /** + * 这里可以先客户端一步拿到每一次 Http 请求的结果, 可以先解析成 Json, 再做一些操作, 如检测到 token 过期后 + * 重新请求 token, 并重新执行请求 + * + * @param httpResult 服务器返回的结果 (已被框架自动转换为字符串) + * @param chain {@link okhttp3.Interceptor.Chain} + * @param response {@link Response} + * @return {@link Response} + */ + @NonNull + Response onHttpResultResponse(@Nullable String httpResult, @NonNull Interceptor.Chain chain, @NonNull Response response); + + /** + * 这里可以在请求服务器之前拿到 {@link Request}, 做一些操作比如给 {@link Request} 统一添加 token 或者 header 以及参数加密等操作 + * + * @param chain {@link okhttp3.Interceptor.Chain} + * @param request {@link Request} + * @return {@link Request} + */ + @NonNull + Request onHttpRequestBefore(@NonNull Interceptor.Chain chain, @NonNull Request request); - //空实现 + /** + * 空实现 + */ GlobalHttpHandler EMPTY = new GlobalHttpHandler() { + + @NonNull @Override - public Response onHttpResultResponse(String httpResult, Interceptor.Chain chain, Response response) { - //不管是否处理,都必须将response返回出去 + public Response onHttpResultResponse(@Nullable String httpResult, @NonNull Interceptor.Chain chain, @NonNull Response response) { + //不管是否处理, 都必须将 response 返回出去 return response; } + @NonNull @Override - public Request onHttpRequestBefore(Interceptor.Chain chain, Request request) { - //不管是否处理,都必须将request返回出去 + public Request onHttpRequestBefore(@NonNull Interceptor.Chain chain, @NonNull Request request) { + //不管是否处理, 都必须将 request 返回出去 return request; } }; - } diff --git a/arms/src/main/java/com/jess/arms/http/imageloader/BaseImageLoaderStrategy.java b/arms/src/main/java/com/jess/arms/http/imageloader/BaseImageLoaderStrategy.java index 76c8e5ace..0af6db10c 100644 --- a/arms/src/main/java/com/jess/arms/http/imageloader/BaseImageLoaderStrategy.java +++ b/arms/src/main/java/com/jess/arms/http/imageloader/BaseImageLoaderStrategy.java @@ -16,6 +16,7 @@ package com.jess.arms.http.imageloader; import android.content.Context; +import android.support.annotation.Nullable; /** * ================================================ @@ -28,19 +29,20 @@ * ================================================ */ public interface BaseImageLoaderStrategy { + /** * 加载图片 * - * @param ctx - * @param config + * @param ctx {@link Context} + * @param config 图片加载配置信息 */ - void loadImage(Context ctx, T config); + void loadImage(@Nullable Context ctx, @Nullable T config); /** * 停止加载 * - * @param ctx - * @param config + * @param ctx {@link Context} + * @param config 图片加载配置信息 */ - void clear(Context ctx, T config); + void clear(@Nullable Context ctx, @Nullable T config); } diff --git a/arms/src/main/java/com/jess/arms/http/imageloader/ImageConfig.java b/arms/src/main/java/com/jess/arms/http/imageloader/ImageConfig.java index f7488fb23..1e4b6303c 100644 --- a/arms/src/main/java/com/jess/arms/http/imageloader/ImageConfig.java +++ b/arms/src/main/java/com/jess/arms/http/imageloader/ImageConfig.java @@ -33,7 +33,6 @@ public class ImageConfig { protected int placeholder;//占位符 protected int errorPic;//错误占位符 - public String getUrl() { return url; } diff --git a/arms/src/main/java/com/jess/arms/http/imageloader/ImageLoader.java b/arms/src/main/java/com/jess/arms/http/imageloader/ImageLoader.java index fcfec59a6..d97319768 100644 --- a/arms/src/main/java/com/jess/arms/http/imageloader/ImageLoader.java +++ b/arms/src/main/java/com/jess/arms/http/imageloader/ImageLoader.java @@ -45,7 +45,6 @@ public final class ImageLoader { public ImageLoader() { } - /** * 加载图片 * diff --git a/arms/src/main/java/com/jess/arms/http/imageloader/glide/GlideAppliesOptions.java b/arms/src/main/java/com/jess/arms/http/imageloader/glide/GlideAppliesOptions.java index dfe0188fc..09c2d8212 100644 --- a/arms/src/main/java/com/jess/arms/http/imageloader/glide/GlideAppliesOptions.java +++ b/arms/src/main/java/com/jess/arms/http/imageloader/glide/GlideAppliesOptions.java @@ -16,6 +16,7 @@ package com.jess.arms.http.imageloader.glide; import android.content.Context; +import android.support.annotation.NonNull; import com.bumptech.glide.Glide; import com.bumptech.glide.GlideBuilder; @@ -31,7 +32,6 @@ * Follow me * ================================================ */ - public interface GlideAppliesOptions { /** @@ -40,5 +40,5 @@ public interface GlideAppliesOptions { * @param context * @param builder {@link GlideBuilder} 此类被用来创建 Glide */ - void applyGlideOptions(Context context, GlideBuilder builder); + void applyGlideOptions(@NonNull Context context, @NonNull GlideBuilder builder); } diff --git a/arms/src/main/java/com/jess/arms/http/imageloader/glide/GlideConfiguration.java b/arms/src/main/java/com/jess/arms/http/imageloader/glide/GlideConfiguration.java index 983673cda..0d3ffb254 100644 --- a/arms/src/main/java/com/jess/arms/http/imageloader/glide/GlideConfiguration.java +++ b/arms/src/main/java/com/jess/arms/http/imageloader/glide/GlideConfiguration.java @@ -16,6 +16,7 @@ package com.jess.arms.http.imageloader.glide; import android.content.Context; +import android.support.annotation.NonNull; import com.bumptech.glide.Glide; import com.bumptech.glide.GlideBuilder; @@ -52,7 +53,7 @@ public class GlideConfiguration extends AppGlideModule { public static final int IMAGE_DISK_CACHE_MAX_SIZE = 100 * 1024 * 1024;//图片缓存文件最大值为100Mb @Override - public void applyOptions(Context context, GlideBuilder builder) { + public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) { final AppComponent appComponent = ArmsUtils.obtainAppComponentFromContext(context); builder.setDiskCache(new DiskCache.Factory() { @Override @@ -82,7 +83,7 @@ public DiskCache build() { } @Override - public void registerComponents(Context context, Glide glide, Registry registry) { + public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) { //Glide 默认使用 HttpURLConnection 做网络请求,在这切换成 Okhttp 请求 AppComponent appComponent = ArmsUtils.obtainAppComponentFromContext(context); registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(appComponent.okHttpClient())); diff --git a/arms/src/main/java/com/jess/arms/http/log/DefaultFormatPrinter.java b/arms/src/main/java/com/jess/arms/http/log/DefaultFormatPrinter.java index 9be062058..0eff6c8e6 100644 --- a/arms/src/main/java/com/jess/arms/http/log/DefaultFormatPrinter.java +++ b/arms/src/main/java/com/jess/arms/http/log/DefaultFormatPrinter.java @@ -15,6 +15,8 @@ */ package com.jess.arms.http.log; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.text.TextUtils; import com.jess.arms.di.module.GlobalConfigModule; @@ -37,7 +39,6 @@ * Follow me * ================================================ */ - public class DefaultFormatPrinter implements FormatPrinter { private static final String TAG = "ArmsHttpLog"; private static final String LINE_SEPARATOR = System.getProperty("line.separator"); @@ -62,7 +63,6 @@ public class DefaultFormatPrinter implements FormatPrinter { private static final String CENTER_LINE = "├ "; private static final String DEFAULT_LINE = "│ "; - private static boolean isEmpty(String line) { return TextUtils.isEmpty(line) || N.equals(line) || T.equals(line) || TextUtils.isEmpty(line.trim()); } @@ -74,7 +74,7 @@ private static boolean isEmpty(String line) { * @param bodyString */ @Override - public void printJsonRequest(Request request, String bodyString) { + public void printJsonRequest(@NonNull Request request, @NonNull String bodyString) { final String requestBody = LINE_SEPARATOR + BODY_TAG + LINE_SEPARATOR + bodyString; final String tag = getTag(true); @@ -91,7 +91,7 @@ public void printJsonRequest(Request request, String bodyString) { * @param request */ @Override - public void printFileRequest(Request request) { + public void printFileRequest(@NonNull Request request) { final String tag = getTag(true); LogUtils.debugInfo(tag, REQUEST_UP_LINE); @@ -115,8 +115,8 @@ public void printFileRequest(Request request) { * @param responseUrl 请求地址 */ @Override - public void printJsonResponse(long chainMs, boolean isSuccessful, int code, String headers, MediaType contentType, - String bodyString, List segments, String message, final String responseUrl) { + public void printJsonResponse(long chainMs, boolean isSuccessful, int code, @NonNull String headers, @Nullable MediaType contentType, + @Nullable String bodyString, @NonNull List segments, @NonNull String message, @NonNull final String responseUrl) { bodyString = RequestInterceptor.isJson(contentType) ? CharacterHandler.jsonFormat(bodyString) : RequestInterceptor.isXml(contentType) ? CharacterHandler.xmlFormat(bodyString) : bodyString; @@ -143,8 +143,8 @@ public void printJsonResponse(long chainMs, boolean isSuccessful, int code, Stri * @param responseUrl 请求地址 */ @Override - public void printFileResponse(long chainMs, boolean isSuccessful, int code, String headers, - List segments, String message, final String responseUrl) { + public void printFileResponse(long chainMs, boolean isSuccessful, int code, @NonNull String headers, + @NonNull List segments, @NonNull String message, @NonNull final String responseUrl) { final String tag = getTag(false); final String[] urlLine = {URL_TAG + responseUrl, N}; @@ -155,7 +155,6 @@ public void printFileResponse(long chainMs, boolean isSuccessful, int code, Stri LogUtils.debugInfo(tag, END_LINE); } - /** * 对 {@code lines} 中的信息进行逐行打印 * @@ -210,7 +209,6 @@ private static String resolveTag(String tag) { return computeKey() + tag; } - private static String[] getRequest(Request request) { String log; String header = request.headers().toString(); @@ -267,7 +265,6 @@ private static String dotHeaders(String header) { return builder.toString(); } - private static String getTag(boolean isRequest) { if (isRequest) { return TAG + "-Request"; @@ -275,5 +272,4 @@ private static String getTag(boolean isRequest) { return TAG + "-Response"; } } - } diff --git a/arms/src/main/java/com/jess/arms/http/log/FormatPrinter.java b/arms/src/main/java/com/jess/arms/http/log/FormatPrinter.java index 02296ad9e..e24ece00f 100644 --- a/arms/src/main/java/com/jess/arms/http/log/FormatPrinter.java +++ b/arms/src/main/java/com/jess/arms/http/log/FormatPrinter.java @@ -15,6 +15,9 @@ */ package com.jess.arms.http.log; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + import com.jess.arms.di.module.GlobalConfigModule; import java.util.List; @@ -42,42 +45,42 @@ public interface FormatPrinter { * @param request * @param bodyString 发送给服务器的请求体中的数据(已解析) */ - void printJsonRequest(Request request, String bodyString); + void printJsonRequest(@NonNull Request request, @NonNull String bodyString); /** * 打印网络请求信息, 当网络请求时 {{@link okhttp3.RequestBody}} 为 {@code null} 或不可解析的情况 * * @param request */ - void printFileRequest(Request request); + void printFileRequest(@NonNull Request request); /** * 打印网络响应信息, 当网络响应时 {{@link okhttp3.ResponseBody}} 可以解析的情况 * - * @param chainMs 服务器响应耗时(单位毫秒) + * @param chainMs 服务器响应耗时(单位毫秒) * @param isSuccessful 请求是否成功 - * @param code 响应码 - * @param headers 请求头 - * @param contentType 服务器返回数据的数据类型 - * @param bodyString 服务器返回的数据(已解析) - * @param segments 域名后面的资源地址 - * @param message 响应信息 - * @param responseUrl 请求地址 + * @param code 响应码 + * @param headers 请求头 + * @param contentType 服务器返回数据的数据类型 + * @param bodyString 服务器返回的数据(已解析) + * @param segments 域名后面的资源地址 + * @param message 响应信息 + * @param responseUrl 请求地址 */ - void printJsonResponse(long chainMs, boolean isSuccessful, int code, String headers, MediaType contentType, - String bodyString, List segments, String message, String responseUrl); + void printJsonResponse(long chainMs, boolean isSuccessful, int code, @NonNull String headers, @Nullable MediaType contentType, + @Nullable String bodyString, @NonNull List segments, @NonNull String message, @NonNull String responseUrl); /** * 打印网络响应信息, 当网络响应时 {{@link okhttp3.ResponseBody}} 为 {@code null} 或不可解析的情况 * - * @param chainMs 服务器响应耗时(单位毫秒) + * @param chainMs 服务器响应耗时(单位毫秒) * @param isSuccessful 请求是否成功 - * @param code 响应码 - * @param headers 请求头 - * @param segments 域名后面的资源地址 - * @param message 响应信息 - * @param responseUrl 请求地址 + * @param code 响应码 + * @param headers 请求头 + * @param segments 域名后面的资源地址 + * @param message 响应信息 + * @param responseUrl 请求地址 */ - void printFileResponse(long chainMs, boolean isSuccessful, int code, String headers, - List segments, String message, String responseUrl); + void printFileResponse(long chainMs, boolean isSuccessful, int code, @NonNull String headers, + @NonNull List segments, @NonNull String message, @NonNull String responseUrl); } diff --git a/arms/src/main/java/com/jess/arms/http/log/RequestInterceptor.java b/arms/src/main/java/com/jess/arms/http/log/RequestInterceptor.java index 4f4e75d23..0d6950a15 100644 --- a/arms/src/main/java/com/jess/arms/http/log/RequestInterceptor.java +++ b/arms/src/main/java/com/jess/arms/http/log/RequestInterceptor.java @@ -179,7 +179,6 @@ private String printResult(Request request, Response response, boolean logRespon } } - /** * 解析服务器响应的内容 * @@ -282,5 +281,4 @@ public static String convertCharset(Charset charset) { return s; return s.substring(i + 1, s.length() - 1); } - } diff --git a/arms/src/main/java/com/jess/arms/integration/ActivityLifecycle.java b/arms/src/main/java/com/jess/arms/integration/ActivityLifecycle.java index a3e469c0a..2575df4d4 100644 --- a/arms/src/main/java/com/jess/arms/integration/ActivityLifecycle.java +++ b/arms/src/main/java/com/jess/arms/integration/ActivityLifecycle.java @@ -197,5 +197,4 @@ private Cache getCacheFromActivity(IActivity activity) { Preconditions.checkNotNull(cache, "%s cannot be null on Activity", Cache.class.getName()); return cache; } - } diff --git a/arms/src/main/java/com/jess/arms/integration/AppManager.java b/arms/src/main/java/com/jess/arms/integration/AppManager.java index 386997210..603c36eb8 100644 --- a/arms/src/main/java/com/jess/arms/integration/AppManager.java +++ b/arms/src/main/java/com/jess/arms/integration/AppManager.java @@ -43,9 +43,7 @@ /** * ================================================ - * 用于管理所有 {@link Activity},和在前台的 {@link Activity} - * 可以通过直接持有 {@link AppManager} 对象执行对应方法 - * 也可以通过 {@link #post(Message)} ,远程遥控执行对应方法,用法和 EventBus 类似 + * 用于管理所有 {@link Activity}, 和在前台的 {@link Activity} * * @see AppManager wiki 官方文档 * Created by JessYan on 14/12/2016 13:50 @@ -254,7 +252,6 @@ public Activity getTopActivity() { return mActivityList.size() > 0 ? mActivityList.get(mActivityList.size() - 1) : null; } - /** * 返回一个存储所有未销毁的 {@link Activity} 的集合 * @@ -267,7 +264,6 @@ public List getActivityList() { return mActivityList; } - /** * 添加 {@link Activity} 到集合 */ @@ -338,7 +334,6 @@ public void killActivity(Class activityClass) { } } - /** * 指定的 {@link Activity} 实例是否存活 * @@ -353,7 +348,6 @@ public boolean activityInstanceIsLive(Activity activity) { return mActivityList.contains(activity); } - /** * 指定的 {@link Activity} class 是否存活(同一个 {@link Activity} class 可能有多个实例) * @@ -373,7 +367,6 @@ public boolean activityClassIsLive(Class activityClass) { return false; } - /** * 获取指定 {@link Activity} class 的实例,没有则返回 null(同一个 {@link Activity} class 有多个实例,则返回最早创建的实例) * @@ -393,7 +386,6 @@ public Activity findActivity(Class activityClass) { return null; } - /** * 关闭所有 {@link Activity} */ @@ -453,7 +445,6 @@ public void killAll(String... excludeActivityName) { } } - /** * 退出应用程序 *

diff --git a/arms/src/main/java/com/jess/arms/integration/ConfigModule.java b/arms/src/main/java/com/jess/arms/integration/ConfigModule.java index 9c6dd5b73..1b14a78d9 100644 --- a/arms/src/main/java/com/jess/arms/integration/ConfigModule.java +++ b/arms/src/main/java/com/jess/arms/integration/ConfigModule.java @@ -15,8 +15,11 @@ */ package com.jess.arms.integration; +import android.app.Activity; import android.app.Application; import android.content.Context; +import android.support.annotation.NonNull; +import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import com.jess.arms.base.delegate.AppLifecycles; @@ -36,35 +39,34 @@ */ public interface ConfigModule { /** - * 使用{@link GlobalConfigModule.Builder}给框架配置一些配置参数 + * 使用 {@link GlobalConfigModule.Builder} 给框架配置一些配置参数 * - * @param context - * @param builder + * @param context {@link Context} + * @param builder {@link GlobalConfigModule.Builder} */ - void applyOptions(Context context, GlobalConfigModule.Builder builder); + void applyOptions(@NonNull Context context, @NonNull GlobalConfigModule.Builder builder); /** - * 使用{@link AppLifecycles}在Application的生命周期中注入一些操作 + * 使用 {@link AppLifecycles} 在 {@link Application} 的生命周期中注入一些操作 * - * @param context - * @param lifecycles + * @param context {@link Context} + * @param lifecycles {@link Application} 的生命周期容器, 可向框架中添加多个 {@link Application} 的生命周期类 */ - void injectAppLifecycle(Context context, List lifecycles); + void injectAppLifecycle(@NonNull Context context, @NonNull List lifecycles); /** - * 使用{@link Application.ActivityLifecycleCallbacks}在Activity的生命周期中注入一些操作 + * 使用 {@link Application.ActivityLifecycleCallbacks} 在 {@link Activity} 的生命周期中注入一些操作 * - * @param context - * @param lifecycles + * @param context {@link Context} + * @param lifecycles {@link Activity} 的生命周期容器, 可向框架中添加多个 {@link Activity} 的生命周期类 */ - void injectActivityLifecycle(Context context, List lifecycles); - + void injectActivityLifecycle(@NonNull Context context, @NonNull List lifecycles); /** - * 使用{@link FragmentManager.FragmentLifecycleCallbacks}在Fragment的生命周期中注入一些操作 + * 使用 {@link FragmentManager.FragmentLifecycleCallbacks} 在 {@link Fragment} 的生命周期中注入一些操作 * - * @param context - * @param lifecycles + * @param context {@link Context} + * @param lifecycles {@link Fragment} 的生命周期容器, 可向框架中添加多个 {@link Fragment} 的生命周期类 */ - void injectFragmentLifecycle(Context context, List lifecycles); + void injectFragmentLifecycle(@NonNull Context context, @NonNull List lifecycles); } diff --git a/arms/src/main/java/com/jess/arms/integration/FragmentLifecycle.java b/arms/src/main/java/com/jess/arms/integration/FragmentLifecycle.java index 34bb86ae8..b2d8bbbd4 100644 --- a/arms/src/main/java/com/jess/arms/integration/FragmentLifecycle.java +++ b/arms/src/main/java/com/jess/arms/integration/FragmentLifecycle.java @@ -164,5 +164,4 @@ private Cache getCacheFromFragment(IFragment fragment) { Preconditions.checkNotNull(cache, "%s cannot be null on Fragment", Cache.class.getName()); return cache; } - } diff --git a/arms/src/main/java/com/jess/arms/integration/IRepositoryManager.java b/arms/src/main/java/com/jess/arms/integration/IRepositoryManager.java index f0db7c2b3..194b655f3 100644 --- a/arms/src/main/java/com/jess/arms/integration/IRepositoryManager.java +++ b/arms/src/main/java/com/jess/arms/integration/IRepositoryManager.java @@ -16,6 +16,7 @@ package com.jess.arms.integration; import android.content.Context; +import android.support.annotation.NonNull; import com.jess.arms.mvp.IModel; @@ -35,26 +36,34 @@ public interface IRepositoryManager { /** * 根据传入的 Class 获取对应的 Retrofit service * - * @param service - * @param - * @return + * @param service Retrofit service class + * @param Retrofit service 类型 + * @return Retrofit service */ - T obtainRetrofitService(Class service); + @NonNull + T obtainRetrofitService(@NonNull Class service); + /** * 根据传入的 Class 获取对应的 RxCache service * - * @param cache - * @param - * @return + * @param cache RxCache service class + * @param RxCache service 类型 + * @return RxCache service */ - T obtainCacheService(Class cache); + @NonNull + T obtainCacheService(@NonNull Class cache); /** * 清理所有缓存 */ void clearAllCache(); + /** + * 获取 {@link Context} + * + * @return {@link Context} + */ + @NonNull Context getContext(); - } diff --git a/arms/src/main/java/com/jess/arms/integration/ManifestParser.java b/arms/src/main/java/com/jess/arms/integration/ManifestParser.java index 821cde1aa..f3c8f5659 100644 --- a/arms/src/main/java/com/jess/arms/integration/ManifestParser.java +++ b/arms/src/main/java/com/jess/arms/integration/ManifestParser.java @@ -34,7 +34,6 @@ */ public final class ManifestParser { private static final String MODULE_VALUE = "ConfigModule"; - private final Context context; public ManifestParser(Context context) { diff --git a/arms/src/main/java/com/jess/arms/integration/RepositoryManager.java b/arms/src/main/java/com/jess/arms/integration/RepositoryManager.java index f66efee49..6b49deb88 100644 --- a/arms/src/main/java/com/jess/arms/integration/RepositoryManager.java +++ b/arms/src/main/java/com/jess/arms/integration/RepositoryManager.java @@ -17,24 +17,21 @@ import android.app.Application; import android.content.Context; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; - import com.jess.arms.integration.cache.Cache; import com.jess.arms.integration.cache.CacheType; import com.jess.arms.mvp.IModel; import com.jess.arms.utils.Preconditions; - +import dagger.Lazy; +import io.reactivex.Observable; +import io.reactivex.Single; +import io.rx_cache2.internal.RxCache; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; - import javax.inject.Inject; import javax.inject.Singleton; - -import dagger.Lazy; -import io.reactivex.Observable; -import io.reactivex.schedulers.Schedulers; -import io.rx_cache2.internal.RxCache; import retrofit2.Retrofit; /** @@ -70,11 +67,12 @@ public RepositoryManager() { * 根据传入的 Class 获取对应的 Retrofit service * * @param serviceClass ApiService class - * @param ApiService class + * @param ApiService class * @return ApiService */ + @NonNull @Override - public synchronized T obtainRetrofitService(Class serviceClass) { + public synchronized T obtainRetrofitService(@NonNull Class serviceClass) { return createWrapperService(serviceClass); } @@ -82,27 +80,41 @@ public synchronized T obtainRetrofitService(Class serviceClass) { * 根据 https://zhuanlan.zhihu.com/p/40097338 对 Retrofit 进行的优化 * * @param serviceClass ApiService class - * @param ApiService class + * @param ApiService class * @return ApiService */ private T createWrapperService(Class serviceClass) { - // 通过二次代理,对 Retrofit 代理方法的调用包进新的 Observable 里在 io 线程执行。 + Preconditions.checkNotNull(serviceClass, "serviceClass == null"); + + // 二次代理 return (T) Proxy.newProxyInstance(serviceClass.getClassLoader(), new Class[]{serviceClass}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, @Nullable Object[] args) throws Throwable { + // 此处在调用 serviceClass 中的方法时触发 + if (method.getReturnType() == Observable.class) { - // 如果方法返回值是 Observable 的话,则包一层再返回 + // 如果方法返回值是 Observable 的话,则包一层再返回, + // 只包一层 defer 由外部去控制耗时方法以及网络请求所处线程, + // 如此对原项目的影响为 0,且更可控。 return Observable.defer(() -> { final T service = getRetrofitService(serviceClass); // 执行真正的 Retrofit 动态代理的方法 return ((Observable) getRetrofitMethod(service, method) - .invoke(service, args)) - .subscribeOn(Schedulers.io()); - }).subscribeOn(Schedulers.single()); + .invoke(service, args)); + }); + } else if (method.getReturnType() == Single.class) { + // 如果方法返回值是 Single 的话,则包一层再返回。 + return Single.defer(() -> { + final T service = getRetrofitService(serviceClass); + // 执行真正的 Retrofit 动态代理的方法 + return ((Single) getRetrofitMethod(service, method) + .invoke(service, args)); + }); } - // 返回值不是 Observable 的话不处理 + + // 返回值不是 Observable 或 Single 的话不处理。 final T service = getRetrofitService(serviceClass); return getRetrofitMethod(service, method).invoke(service, args); } @@ -113,7 +125,7 @@ public Object invoke(Object proxy, Method method, @Nullable Object[] args) * 根据传入的 Class 获取对应的 Retrofit service * * @param serviceClass ApiService class - * @param ApiService class + * @param ApiService class * @return ApiService */ private T getRetrofitService(Class serviceClass) { @@ -138,11 +150,13 @@ private Method getRetrofitMethod(T service, Method method) throws NoSuchMeth * 根据传入的 Class 获取对应的 RxCache service * * @param cacheClass Cache class - * @param Cache class + * @param Cache class * @return Cache */ + @NonNull @Override - public synchronized T obtainCacheService(Class cacheClass) { + public synchronized T obtainCacheService(@NonNull Class cacheClass) { + Preconditions.checkNotNull(cacheClass, "cacheClass == null"); if (mCacheServiceCache == null) { mCacheServiceCache = mCachefactory.build(CacheType.CACHE_SERVICE_CACHE); } @@ -164,6 +178,7 @@ public void clearAllCache() { mRxCache.get().evictAll().subscribe(); } + @NonNull @Override public Context getContext() { return mApplication; diff --git a/arms/src/main/java/com/jess/arms/integration/cache/Cache.java b/arms/src/main/java/com/jess/arms/integration/cache/Cache.java index 4630d836a..872aa1d6d 100644 --- a/arms/src/main/java/com/jess/arms/integration/cache/Cache.java +++ b/arms/src/main/java/com/jess/arms/integration/cache/Cache.java @@ -37,6 +37,7 @@ * ================================================ */ public interface Cache { + interface Factory { /** diff --git a/arms/src/main/java/com/jess/arms/integration/lifecycle/FragmentLifecycleForRxLifecycle.java b/arms/src/main/java/com/jess/arms/integration/lifecycle/FragmentLifecycleForRxLifecycle.java index da1cb00f9..104e93566 100644 --- a/arms/src/main/java/com/jess/arms/integration/lifecycle/FragmentLifecycleForRxLifecycle.java +++ b/arms/src/main/java/com/jess/arms/integration/lifecycle/FragmentLifecycleForRxLifecycle.java @@ -52,7 +52,6 @@ public void onFragmentAttached(FragmentManager fm, Fragment f, Context context) } } - @Override public void onFragmentCreated(FragmentManager fm, Fragment f, Bundle savedInstanceState) { if (f instanceof FragmentLifecycleable) { @@ -60,7 +59,6 @@ public void onFragmentCreated(FragmentManager fm, Fragment f, Bundle savedInstan } } - @Override public void onFragmentViewCreated(FragmentManager fm, Fragment f, View v, Bundle savedInstanceState) { if (f instanceof FragmentLifecycleable) { diff --git a/arms/src/main/java/com/jess/arms/mvp/BasePresenter.java b/arms/src/main/java/com/jess/arms/mvp/BasePresenter.java index 1a4798c56..a32e24d5b 100644 --- a/arms/src/main/java/com/jess/arms/mvp/BasePresenter.java +++ b/arms/src/main/java/com/jess/arms/mvp/BasePresenter.java @@ -46,7 +46,6 @@ public class BasePresenter implements IPresenter, LifecycleObserver { protected final String TAG = this.getClass().getSimpleName(); protected CompositeDisposable mCompositeDisposable; - protected M mModel; protected V mRootView; @@ -79,7 +78,6 @@ public BasePresenter() { onStart(); } - @Override public void onStart() { //将 LifecycleObserver 注册给 LifecycleOwner 后 @OnLifecycleEvent 才可以正常使用 @@ -89,8 +87,8 @@ public void onStart() { ((LifecycleOwner) mRootView).getLifecycle().addObserver((LifecycleObserver) mModel); } } - if (useEventBus())//如果要使用 Eventbus 请将此方法返回 true - EventBusManager.getInstance().register(this);//注册 Eventbus + if (useEventBus())//如果要使用 EventBus 请将此方法返回 true + EventBusManager.getInstance().register(this);//注册 EventBus } /** @@ -98,8 +96,8 @@ public void onStart() { */ @Override public void onDestroy() { - if (useEventBus())//如果要使用 Eventbus 请将此方法返回 true - EventBusManager.getInstance().unregister(this);//解除注册 Eventbus + if (useEventBus())//如果要使用 EventBus 请将此方法返回 true + EventBusManager.getInstance().unregister(this);//注销 EventBus unDispose();//解除订阅 if (mModel != null) mModel.onDestroy(); @@ -139,7 +137,6 @@ public boolean useEventBus() { return true; } - /** * 将 {@link Disposable} 添加到 {@link CompositeDisposable} 中统一管理 * 可在 {@link Activity#onDestroy()} 中使用 {@link #unDispose()} 停止正在执行的 RxJava 任务,避免内存泄漏 @@ -151,7 +148,7 @@ public void addDispose(Disposable disposable) { if (mCompositeDisposable == null) { mCompositeDisposable = new CompositeDisposable(); } - mCompositeDisposable.add(disposable);//将所有 Disposable 放入集中处理 + mCompositeDisposable.add(disposable);//将所有 Disposable 放入容器集中处理 } /** @@ -162,6 +159,4 @@ public void unDispose() { mCompositeDisposable.clear();//保证 Activity 结束时取消所有正在执行的订阅 } } - - } diff --git a/arms/src/main/java/com/jess/arms/utils/ArmsUtils.java b/arms/src/main/java/com/jess/arms/utils/ArmsUtils.java index 5f4aabafb..e169b52f3 100644 --- a/arms/src/main/java/com/jess/arms/utils/ArmsUtils.java +++ b/arms/src/main/java/com/jess/arms/utils/ArmsUtils.java @@ -53,7 +53,6 @@ public class ArmsUtils { static public Toast mToast; - private ArmsUtils() { throw new IllegalStateException("you can't instantiate me!"); } @@ -176,7 +175,6 @@ public static String getString(Context context, int stringID) { * * @return */ - public static String getString(Context context, String strName) { return getString(context, getResources(context).getIdentifier(strName, "string", context.getPackageName())); } @@ -269,7 +267,6 @@ public static void snackbarTextWithLong(String text) { AppManager.getAppManager().showSnackbar(text, true); } - /** * 通过资源id获得drawable * @@ -280,7 +277,6 @@ public static Drawable getDrawablebyResource(Context context, int rID) { return getResources(context).getDrawable(rID); } - /** * 跳转界面 1, 通过 {@link AppManager#startActivity(Class)} * @@ -299,7 +295,6 @@ public static void startActivity(Intent content) { AppManager.getAppManager().startActivity(content); } - /** * 跳转界面 3 * @@ -338,7 +333,6 @@ public static int getScreenHeidth(Context context) { return getResources(context).getDisplayMetrics().heightPixels; } - /** * 获得颜色 */ @@ -373,7 +367,6 @@ public static boolean isEmpty(Object obj) { return false; } - /** * MD5 * @@ -399,7 +392,6 @@ public static String encodeToMD5(String string) { return hex.toString(); } - /** * 全屏,并且沉侵式状态栏 * @@ -413,7 +405,6 @@ public static void statuInScreen(Activity activity) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); } - /** * 配置 RecyclerView * @@ -463,5 +454,4 @@ public static AppComponent obtainAppComponentFromContext(Context context) { Preconditions.checkState(context.getApplicationContext() instanceof App, "%s must be implements %s", context.getApplicationContext().getClass().getName(), App.class.getName()); return ((App) context.getApplicationContext()).getAppComponent(); } - } diff --git a/arms/src/main/java/com/jess/arms/utils/CharacterHandler.java b/arms/src/main/java/com/jess/arms/utils/CharacterHandler.java index 44e5a60f1..d5ed75533 100644 --- a/arms/src/main/java/com/jess/arms/utils/CharacterHandler.java +++ b/arms/src/main/java/com/jess/arms/utils/CharacterHandler.java @@ -52,7 +52,6 @@ private CharacterHandler() { } public static final InputFilter emojiFilter = new InputFilter() {//emoji过滤器 - Pattern emoji = Pattern.compile( "[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]", Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE); @@ -70,7 +69,6 @@ public CharSequence filter(CharSequence source, int start, int end, Spanned dest } }; - /** * 字符串转换成十六进制字符串 * @@ -92,7 +90,6 @@ public static String str2HexStr(String str) { return sb.toString().trim(); } - /** * json 格式化 * @@ -117,11 +114,12 @@ public static String jsonFormat(String json) { } } catch (JSONException e) { message = json; + } catch (OutOfMemoryError error) { + message = "Output omitted because of Object size"; } return message; } - /** * xml 格式化 * diff --git a/arms/src/main/java/com/jess/arms/utils/DataHelper.java b/arms/src/main/java/com/jess/arms/utils/DataHelper.java index 12a58a999..2775e3e97 100644 --- a/arms/src/main/java/com/jess/arms/utils/DataHelper.java +++ b/arms/src/main/java/com/jess/arms/utils/DataHelper.java @@ -41,7 +41,6 @@ public class DataHelper { private static SharedPreferences mSharedPreferences; public static final String SP_NAME = "config"; - private DataHelper() { throw new IllegalStateException("you can't instantiate me!"); } @@ -210,7 +209,6 @@ public static String getCacheFilePath(Context context) { return "/mnt/sdcard/" + packageName; } - /** * 创建未存在的文件夹 * @@ -274,7 +272,6 @@ public static boolean deleteDir(File dir) { return true; } - public static String bytyToString(InputStream in) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; @@ -286,5 +283,4 @@ public static String bytyToString(InputStream in) throws IOException { out.close(); return result; } - } diff --git a/arms/src/main/java/com/jess/arms/utils/DeviceUtils.java b/arms/src/main/java/com/jess/arms/utils/DeviceUtils.java index 23017e4ee..eddbc9cd7 100644 --- a/arms/src/main/java/com/jess/arms/utils/DeviceUtils.java +++ b/arms/src/main/java/com/jess/arms/utils/DeviceUtils.java @@ -63,7 +63,6 @@ public class DeviceUtils { public static final int NETTYPE_WIFI = 0x01; public static final int NETTYPE_CMWAP = 0x02; public static final int NETTYPE_CMNET = 0x03; - public static boolean GTE_HC; public static boolean GTE_ICS; public static boolean PRE_HC; @@ -213,7 +212,6 @@ public static int getStatusBarHeight(Context context) { return 0; } - public static boolean hasBigScreen(Context context) { boolean flag = true; if (_hasBigScreen == null) { @@ -371,7 +369,6 @@ public static boolean isTablet(Context context) { return _isTablet.booleanValue(); } - public static void showAnimatedView(View view) { if (PRE_HC && view != null) view.setPadding(0, 0, 0, 0); @@ -433,7 +430,6 @@ public static String percent2(double p1, double p2) { return str; } - public static boolean isHaveMarket(Context context) { Intent intent = new Intent(); intent.setAction("android.intent.action.MAIN"); @@ -719,7 +715,6 @@ public static int getStatuBarHeight(Context context) { return sbar; } - public static boolean hasStatusBar(Activity activity) { WindowManager.LayoutParams attrs = activity.getWindow().getAttributes(); if ((attrs.flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) == WindowManager.LayoutParams.FLAG_FULLSCREEN) { @@ -798,8 +793,6 @@ public static boolean isExitsSdcard() { else return false; } - - } diff --git a/arms/src/main/java/com/jess/arms/utils/DrawableProvider.java b/arms/src/main/java/com/jess/arms/utils/DrawableProvider.java index 76c834746..3ffc89018 100644 --- a/arms/src/main/java/com/jess/arms/utils/DrawableProvider.java +++ b/arms/src/main/java/com/jess/arms/utils/DrawableProvider.java @@ -146,7 +146,6 @@ public static Bitmap getReSizeBitmap(Bitmap bitmap, float targetWidth, float tar return returnBm; } - /** * 将图片按照某个角度进行旋转 * @@ -175,7 +174,6 @@ public static Bitmap rotateBitmapByDegree(Bitmap bm, int degree) { return returnBm; } - /** * 读取图片的旋转的角度 * @@ -206,5 +204,4 @@ public static int getBitmapDegree(String path) { } return degree; } - } \ No newline at end of file diff --git a/arms/src/main/java/com/jess/arms/utils/PermissionUtil.java b/arms/src/main/java/com/jess/arms/utils/PermissionUtil.java index 4023a919c..acc1cf7aa 100644 --- a/arms/src/main/java/com/jess/arms/utils/PermissionUtil.java +++ b/arms/src/main/java/com/jess/arms/utils/PermissionUtil.java @@ -41,12 +41,12 @@ public class PermissionUtil { public static final String TAG = "Permission"; - private PermissionUtil() { throw new IllegalStateException("you can't instantiate me!"); } public interface RequestPermission { + /** * 权限请求成功 */ @@ -67,7 +67,6 @@ public interface RequestPermission { void onRequestPermissionFailureWithAskNeverAgain(List permissions); } - public static void requestPermission(final RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler, String... permissions) { if (permissions == null || permissions.length == 0) return; @@ -118,7 +117,6 @@ public void onNext(@NonNull List permissions) { } - /** * 请求摄像头权限 */ @@ -126,7 +124,6 @@ public static void launchCamera(RequestPermission requestPermission, RxPermissio requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA); } - /** * 请求外部存储的权限 */ @@ -134,7 +131,6 @@ public static void externalStorage(RequestPermission requestPermission, RxPermis requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.WRITE_EXTERNAL_STORAGE); } - /** * 请求发送短信权限 */ @@ -142,7 +138,6 @@ public static void sendSms(RequestPermission requestPermission, RxPermissions rx requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.SEND_SMS); } - /** * 请求打电话权限 */ @@ -150,13 +145,11 @@ public static void callPhone(RequestPermission requestPermission, RxPermissions requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.CALL_PHONE); } - /** * 请求获取手机状态的权限 */ public static void readPhonestate(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) { requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.READ_PHONE_STATE); } - } diff --git a/arms/src/main/java/com/jess/arms/utils/RxLifecycleUtils.java b/arms/src/main/java/com/jess/arms/utils/RxLifecycleUtils.java index 7e82ac4be..910843b45 100644 --- a/arms/src/main/java/com/jess/arms/utils/RxLifecycleUtils.java +++ b/arms/src/main/java/com/jess/arms/utils/RxLifecycleUtils.java @@ -85,7 +85,6 @@ public static LifecycleTransformer bindUntilEvent(@NonNull final Lifec return RxLifecycle.bindUntilEvent(lifecycleable.provideLifecycleSubject(), event); } - /** * 绑定 Activity/Fragment 的生命周期 * @@ -112,5 +111,4 @@ public static LifecycleTransformer bindToLifecycle(@NonNull Lifecycleable throw new IllegalArgumentException("Lifecycleable not match"); } } - } diff --git a/arms/src/main/java/com/jess/arms/utils/ZipHelper.java b/arms/src/main/java/com/jess/arms/utils/ZipHelper.java index 52cd17d0a..2d0cdbb0e 100644 --- a/arms/src/main/java/com/jess/arms/utils/ZipHelper.java +++ b/arms/src/main/java/com/jess/arms/utils/ZipHelper.java @@ -39,7 +39,6 @@ */ public class ZipHelper { - private ZipHelper() { throw new IllegalStateException("you can't instantiate me!"); } @@ -54,7 +53,6 @@ public static String decompressToStringForZlib(byte[] bytesToDecompress) { return decompressToStringForZlib(bytesToDecompress, "UTF-8"); } - /** * zlib decompress 2 String * @@ -86,7 +84,6 @@ public static String decompressToStringForZlib(byte[] bytesToDecompress, String } - /** * zlib decompress 2 byte * diff --git a/arms/src/main/java/com/jess/arms/widget/CustomPopupWindow.java b/arms/src/main/java/com/jess/arms/widget/CustomPopupWindow.java index 1734b3957..3770d855e 100644 --- a/arms/src/main/java/com/jess/arms/widget/CustomPopupWindow.java +++ b/arms/src/main/java/com/jess/arms/widget/CustomPopupWindow.java @@ -103,7 +103,6 @@ public void show() {//默认显示到中间 } } - public static final class Builder { private View contentView; private View parentView; @@ -132,13 +131,11 @@ public Builder isWrap(boolean isWrap) { return this; } - public Builder customListener(CustomPopupWindowListener listener) { this.listener = listener; return this; } - public Builder isOutsideTouch(boolean isOutsideTouch) { this.isOutsideTouch = isOutsideTouch; return this; @@ -172,5 +169,4 @@ public CustomPopupWindow build() { public interface CustomPopupWindowListener { public void initPopupView(View contentView); } - } diff --git a/build.gradle b/build.gradle index 7ab2f5a43..38ae60ae2 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.android.tools.build:gradle:3.4.2' //Gradle Android Maven plugin classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' //Gradle Bintray Plugin diff --git a/config.gradle b/config.gradle index a9311b60e..93d6d23b3 100644 --- a/config.gradle +++ b/config.gradle @@ -5,20 +5,20 @@ ext { buildToolsVersion : "28.0.3", minSdkVersion : 14, targetSdkVersion : 28, - versionCode : 180, - versionName : "2.5.0" + versionCode : 185, + versionName : "2.5.1" ] version = [ androidSupportSdkVersion: "28.0.0", - retrofitSdkVersion : "2.4.0", - dagger2SdkVersion : "2.19", - glideSdkVersion : "4.8.0", - butterknifeSdkVersion : "8.8.1", + retrofitSdkVersion : "2.6.0", + dagger2SdkVersion : "2.23.2", + glideSdkVersion : "4.9.0", + butterknifeSdkVersion : "9.0.0", rxlifecycleSdkVersion : "1.0", rxlifecycle2SdkVersion : "2.2.2", espressoSdkVersion : "3.0.1", - canarySdkVersion : "1.5.4" + canarySdkVersion : "1.6.3" ] dependencies = [ @@ -35,7 +35,8 @@ ext { "retrofit-converter-gson" : "com.squareup.retrofit2:converter-gson:${version["retrofitSdkVersion"]}", "retrofit-adapter-rxjava" : "com.squareup.retrofit2:adapter-rxjava:${version["retrofitSdkVersion"]}", "retrofit-adapter-rxjava2" : "com.squareup.retrofit2:adapter-rxjava2:${version["retrofitSdkVersion"]}", - "okhttp3" : "com.squareup.okhttp3:okhttp:3.11.0", + "okhttp3" : "com.squareup.okhttp3:okhttp:3.12.0", + "okhttp4" : "com.squareup.okhttp3:okhttp:4.0.0", "okhttp-urlconnection" : "com.squareup.okhttp:okhttp-urlconnection:2.0.0", "glide" : "com.github.bumptech.glide:glide:${version["glideSdkVersion"]}", "glide-compiler" : "com.github.bumptech.glide:compiler:${version["glideSdkVersion"]}", @@ -52,7 +53,7 @@ ext { "nineoldandroids" : "com.nineoldandroids:library:2.4.0", "paginate" : "com.github.markomilos:paginate:0.5.1", "vlayout" : "com.alibaba.android:vlayout:1.1.0@aar", - "autosize" : "me.jessyan:autosize:1.0.6", + "autosize" : "me.jessyan:autosize:1.1.2", //rx1 "rxandroid" : "io.reactivex:rxandroid:1.2.1", @@ -66,14 +67,14 @@ ext { "rxerrorhandler" : "me.jessyan:rxerrorhandler:1.0.1", //rx2 - "rxandroid2" : "io.reactivex.rxjava2:rxandroid:2.1.0", - "rxjava2" : "io.reactivex.rxjava2:rxjava:2.2.3", - "rxlifecycle2" : "com.trello.rxlifecycle2:rxlifecycle:${version["rxlifecycle2SdkVersion"]}", - "rxlifecycle2-android" : "com.trello.rxlifecycle2:rxlifecycle-android:${version["rxlifecycle2SdkVersion"]}", - "rxlifecycle2-components" : "com.trello.rxlifecycle2:rxlifecycle-components:${version["rxlifecycle2SdkVersion"]}", - "rxcache2" : "com.github.VictorAlbertos.RxCache:runtime:1.8.3-2.x", - "rxpermissions2" : "com.github.tbruyelle:rxpermissions:0.10.2", - "rxerrorhandler2" : "me.jessyan:rxerrorhandler:2.1.1", + "rxandroid2" : "io.reactivex.rxjava2:rxandroid:2.1.1", + "rxjava2" : "io.reactivex.rxjava2:rxjava:2.2.10", + "rxlifecycle2" : "com.trello.rxlifecycle2:rxlifecycle:${version["rxlifecycle2SdkVersion"]}", + "rxlifecycle2-android" : "com.trello.rxlifecycle2:rxlifecycle-android:${version["rxlifecycle2SdkVersion"]}", + "rxlifecycle2-components" : "com.trello.rxlifecycle2:rxlifecycle-components:${version["rxlifecycle2SdkVersion"]}", + "rxcache2" : "com.github.VictorAlbertos.RxCache:runtime:1.8.3-2.x", + "rxpermissions2" : "com.github.tbruyelle:rxpermissions:0.10.2", + "rxerrorhandler2" : "me.jessyan:rxerrorhandler:2.1.1", //tools "dagger2" : "com.google.dagger:dagger:${version["dagger2SdkVersion"]}", @@ -85,7 +86,7 @@ ext { "eventbus" : "org.greenrobot:eventbus:3.1.1", "otto" : "com.squareup:otto:1.3.8", "gson" : "com.google.code.gson:gson:2.8.5", - "multidex" : "com.android.support:multidex:1.0.1", + "multidex" : "com.android.support:multidex:1.0.3", "javax.annotation" : "javax.annotation:jsr250-api:1.0", "arouter" : "com.alibaba:arouter-api:1.3.1", "arouter-compiler" : "com.alibaba:arouter-compiler:1.1.4", @@ -107,6 +108,4 @@ ext { "canary-release" : "com.squareup.leakcanary:leakcanary-android-no-op:${version["canarySdkVersion"]}", "umeng-analytics" : "com.umeng.analytics:analytics:6.0.1" ] - - } diff --git a/demo/build.gradle b/demo/build.gradle index b2f025e75..a8f61a03b 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -71,20 +71,20 @@ dependencies { implementation rootProject.ext.dependencies["paginate"] //arms - implementation project(':arms') - //Github 仓库上最新的 Demo 具有下一个版本的新特性, 所以依赖最新的远程库会出现版本不兼容的情况, 详情请查看 https://github.com/JessYanCoding/MVPArms/wiki/Issues#2 -// implementation 'me.jessyan:arms:2.5.0' +// implementation project(':arms') + implementation 'me.jessyan:arms:2.5.1' //Arms 核心库不再包含 AndroidAutoLayout, 现在可自行选择屏幕适配方案, 不想使用 AndroidAutoLayout 就不要依赖 arms-autolayout -// implementation 'me.jessyan:arms-autolayout:2.5.0' +// implementation 'me.jessyan:arms-autolayout:2.5.1' //现在已经将 Demo 中的屏幕适配框架从 AndroidAutoLayout 替换为 AndroidAutoSize, AndroidAutoLayout 和 AndroidAutoSize 可以在项目中共存 - //所以旧项目只要依赖 arms-autolayout 即可兼容之前的旧页面, 新页面使用 AndroidAutoSize 进行适配即可 + //所以旧项目只要依赖 arms-autolayout 即可兼容之前的旧页面, 新页面可以使用 AndroidAutoSize 进行适配, 等有时间了再将旧页面全部替换为 AndroidAutoSize implementation rootProject.ext.dependencies["autosize"] //Arms 核心库不再包含 Glide, 想使用其他图片加载框架或者想自行扩展 ImageLoaderStrategy 就不要依赖 arms-imageloader-glide //依赖 arms-imageloader-glide 后还需要在 GlobalConfiguration 中手动注册 GlideImageLoaderStrategy - implementation 'me.jessyan:arms-imageloader-glide:2.5.0' + implementation 'me.jessyan:arms-imageloader-glide:2.5.1' +// implementation project(':arms-imageloader-glide') //test testImplementation rootProject.ext.dependencies["junit"] diff --git a/demo/proguard-rules.pro b/demo/proguard-rules.pro index 657cd45d8..fcfebc681 100644 --- a/demo/proguard-rules.pro +++ b/demo/proguard-rules.pro @@ -16,4 +16,4 @@ # public *; #} -# 混淆规则在 arms moudule下的proguard-rules.pro中,混淆前先参阅https://github.com/JessYanCoding/MVPArms/wiki#1.5 \ No newline at end of file +# 混淆规则在 arms moudule 下的 proguard-rules.pro 中, 混淆前先参阅 https://github.com/JessYanCoding/MVPArms/wiki#1.5 \ No newline at end of file diff --git a/demo/src/main/java/me/jessyan/mvparms/demo/app/GlobalConfiguration.java b/demo/src/main/java/me/jessyan/mvparms/demo/app/GlobalConfiguration.java index 9aa1e59fa..4848d0ea3 100644 --- a/demo/src/main/java/me/jessyan/mvparms/demo/app/GlobalConfiguration.java +++ b/demo/src/main/java/me/jessyan/mvparms/demo/app/GlobalConfiguration.java @@ -17,6 +17,7 @@ import android.app.Application; import android.content.Context; +import android.support.annotation.NonNull; import android.support.v4.app.FragmentManager; import com.jess.arms.base.delegate.AppLifecycles; import com.jess.arms.di.module.GlobalConfigModule; @@ -34,7 +35,7 @@ * ================================================ * App 的全局配置信息在此配置, 需要将此实现类声明到 AndroidManifest 中 * ConfigModule 的实现类可以有无数多个, 在 Application 中只是注册回调, 并不会影响性能 (多个 ConfigModule 在多 Module 环境下尤为受用) - * 不过要注意 ConfigModule 接口的实现类对象是通过反射生成的, 这里会有些性能损耗 + * ConfigModule 接口的实现类对象是通过反射生成的, 这里会有些性能损耗 * * @see com.jess.arms.base.delegate.AppDelegate * @see com.jess.arms.integration.ManifestParser @@ -51,8 +52,8 @@ public final class GlobalConfiguration implements ConfigModule { // public static String sDomain = Api.APP_DOMAIN; @Override - public void applyOptions(Context context, GlobalConfigModule.Builder builder) { - if (!BuildConfig.LOG_DEBUG) { //Release 时,让框架不再打印 Http 请求和响应的信息 + public void applyOptions(@NonNull Context context, @NonNull GlobalConfigModule.Builder builder) { + if (!BuildConfig.LOG_DEBUG) { //Release 时, 让框架不再打印 Http 请求和响应的信息 builder.printHttpLogLevel(RequestInterceptor.Level.NONE); } @@ -64,7 +65,7 @@ public void applyOptions(Context context, GlobalConfigModule.Builder builder) { //想支持多 BaseUrl, 以及运行时动态切换任意一个 BaseUrl, 请使用 https://github.com/JessYanCoding/RetrofitUrlManager //如果 BaseUrl 在 App 启动时不能确定, 需要请求服务器接口动态获取, 请使用以下代码 //以下方式是 Arms 框架自带的切换 BaseUrl 的方式, 在整个 App 生命周期内只能切换一次, 若需要无限次的切换 BaseUrl, 以及各种复杂的应用场景还是需要使用 RetrofitUrlManager 框架 - //以下代码只是配置, 还要使用 Okhttp (AppComponent中提供) 请求服务器获取到正确的 BaseUrl 后赋值给 GlobalConfiguration.sDomain + //以下代码只是配置, 还要使用 Okhttp (AppComponent 中提供) 请求服务器获取到正确的 BaseUrl 后赋值给 GlobalConfiguration.sDomain //切记整个过程必须在第一次调用 Retrofit 接口之前完成, 如果已经调用过 Retrofit 接口, 此种方式将不能切换 BaseUrl // .baseurl(new BaseUrl() { // @Override @@ -114,54 +115,57 @@ public void applyOptions(Context context, GlobalConfigModule.Builder builder) { // Timber.i("printFileResponse:" + responseUrl); // } // }) - // 可以自定义一个单例的线程池供全局使用。 + + //可以自定义一个单例的线程池供全局使用 // .executorService(Executors.newCachedThreadPool()) - // 这里提供一个全局处理 Http 请求和响应结果的处理类,可以比客户端提前一步拿到服务器返回的结果,可以做一些操作,比如token超时,重新获取 + + //这里提供一个全局处理 Http 请求和响应结果的处理类, 可以比客户端提前一步拿到服务器返回的结果, 可以做一些操作, 比如 Token 超时后, 重新获取 Token .globalHttpHandler(new GlobalHttpHandlerImpl(context)) - // 用来处理 rxjava 中发生的所有错误,rxjava 中发生的每个错误都会回调此接口 - // rxjava必要要使用ErrorHandleSubscriber(默认实现Subscriber的onError方法),此监听才生效 + //用来处理 RxJava 中发生的所有错误, RxJava 中发生的每个错误都会回调此接口 + //RxJava 必须要使用 ErrorHandleSubscriber (默认实现 Subscriber 的 onError 方法), 此监听才生效 .responseErrorListener(new ResponseErrorListenerImpl()) - .gsonConfiguration((context1, gsonBuilder) -> {//这里可以自己自定义配置Gson的参数 + .gsonConfiguration((context1, gsonBuilder) -> {//这里可以自己自定义配置 Gson 的参数 gsonBuilder - .serializeNulls()//支持序列化null的参数 - .enableComplexMapKeySerialization();//支持将序列化key为object的map,默认只能序列化key为string的map + .serializeNulls()//支持序列化值为 null 的参数 + .enableComplexMapKeySerialization();//支持将序列化 key 为 Object 的 Map, 默认只能序列化 key 为 String 的 Map }) - .retrofitConfiguration((context1, retrofitBuilder) -> {//这里可以自己自定义配置Retrofit的参数, 甚至您可以替换框架配置好的 OkHttpClient 对象 (但是不建议这样做, 这样做您将损失框架提供的很多功能) -// retrofitBuilder.addConverterFactory(FastJsonConverterFactory.create());//比如使用fastjson替代gson + .retrofitConfiguration((context1, retrofitBuilder) -> {//这里可以自己自定义配置 Retrofit 的参数, 甚至您可以替换框架配置好的 OkHttpClient 对象 (但是不建议这样做, 这样做您将损失框架提供的很多功能) +// retrofitBuilder.addConverterFactory(FastJsonConverterFactory.create());//比如使用 FastJson 替代 Gson }) - .okhttpConfiguration((context1, okhttpBuilder) -> {//这里可以自己自定义配置Okhttp的参数 -// okhttpBuilder.sslSocketFactory(); //支持 Https,详情请百度 + .okhttpConfiguration((context1, okhttpBuilder) -> {//这里可以自己自定义配置 Okhttp 的参数 +// okhttpBuilder.sslSocketFactory(); //支持 Https, 详情请百度 okhttpBuilder.writeTimeout(10, TimeUnit.SECONDS); - //使用一行代码监听 Retrofit/Okhttp 上传下载进度监听,以及 Glide 加载进度监听 详细使用方法查看 https://github.com/JessYanCoding/ProgressManager + //使用一行代码监听 Retrofit/Okhttp 上传下载进度监听,以及 Glide 加载进度监听, 详细使用方法请查看 https://github.com/JessYanCoding/ProgressManager ProgressManager.getInstance().with(okhttpBuilder); - //让 Retrofit 同时支持多个 BaseUrl 以及动态改变 BaseUrl. 详细使用请方法查看 https://github.com/JessYanCoding/RetrofitUrlManager + //让 Retrofit 同时支持多个 BaseUrl 以及动态改变 BaseUrl, 详细使用方法请查看 https://github.com/JessYanCoding/RetrofitUrlManager RetrofitUrlManager.getInstance().with(okhttpBuilder); }) .rxCacheConfiguration((context1, rxCacheBuilder) -> {//这里可以自己自定义配置 RxCache 的参数 rxCacheBuilder.useExpiredDataIfLoaderNotAvailable(true); - // 想自定义 RxCache 的缓存文件夹或者解析方式, 如改成 fastjson, 请 return rxCacheBuilder.persistence(cacheDirectory, new FastJsonSpeaker()); - // 否则请 return null; + //想自定义 RxCache 的缓存文件夹或者解析方式, 如改成 FastJson, 请 return rxCacheBuilder.persistence(cacheDirectory, new FastJsonSpeaker()); + //否则请 return null; return null; }); } @Override - public void injectAppLifecycle(Context context, List lifecycles) { - // AppLifecycles 的所有方法都会在基类 Application 的对应的生命周期中被调用,所以在对应的方法中可以扩展一些自己需要的逻辑 - // 可以根据不同的逻辑添加多个实现类 + public void injectAppLifecycle(@NonNull Context context, @NonNull List lifecycles) { + //AppLifecycles 中的所有方法都会在基类 Application 的对应生命周期中被调用, 所以在对应的方法中可以扩展一些自己需要的逻辑 + //可以根据不同的逻辑添加多个实现类 lifecycles.add(new AppLifecyclesImpl()); } @Override - public void injectActivityLifecycle(Context context, List lifecycles) { - // ActivityLifecycleCallbacks 的所有方法都会在 Activity (包括三方库) 的对应的生命周期中被调用,所以在对应的方法中可以扩展一些自己需要的逻辑 - // 可以根据不同的逻辑添加多个实现类 + public void injectActivityLifecycle(@NonNull Context context, @NonNull List lifecycles) { + //ActivityLifecycleCallbacks 中的所有方法都会在 Activity (包括三方库) 的对应生命周期中被调用, 所以在对应的方法中可以扩展一些自己需要的逻辑 + //可以根据不同的逻辑添加多个实现类 lifecycles.add(new ActivityLifecycleCallbacksImpl()); } @Override - public void injectFragmentLifecycle(Context context, List lifecycles) { + public void injectFragmentLifecycle(@NonNull Context context, @NonNull List lifecycles) { + //FragmentLifecycleCallbacks 中的所有方法都会在 Fragment (包括三方库) 的对应生命周期中被调用, 所以在对应的方法中可以扩展一些自己需要的逻辑 + //可以根据不同的逻辑添加多个实现类 lifecycles.add(new FragmentLifecycleCallbacksImpl()); } - } diff --git a/demo/src/main/java/me/jessyan/mvparms/demo/app/GlobalHttpHandlerImpl.java b/demo/src/main/java/me/jessyan/mvparms/demo/app/GlobalHttpHandlerImpl.java index 3ba890a8d..a7e20c38c 100644 --- a/demo/src/main/java/me/jessyan/mvparms/demo/app/GlobalHttpHandlerImpl.java +++ b/demo/src/main/java/me/jessyan/mvparms/demo/app/GlobalHttpHandlerImpl.java @@ -16,6 +16,8 @@ package me.jessyan.mvparms.demo.app; import android.content.Context; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.text.TextUtils; import com.google.gson.reflect.TypeToken; @@ -52,12 +54,13 @@ public GlobalHttpHandlerImpl(Context context) { * 重新请求 token, 并重新执行请求 * * @param httpResult 服务器返回的结果 (已被框架自动转换为字符串) - * @param chain {@link okhttp3.Interceptor.Chain} - * @param response {@link Response} - * @return + * @param chain {@link okhttp3.Interceptor.Chain} + * @param response {@link Response} + * @return {@link Response} */ + @NonNull @Override - public Response onHttpResultResponse(String httpResult, Interceptor.Chain chain, Response response) { + public Response onHttpResultResponse(@Nullable String httpResult, @NonNull Interceptor.Chain chain, @NonNull Response response) { if (!TextUtils.isEmpty(httpResult) && RequestInterceptor.isJson(response.body().contentType())) { try { List list = ArmsUtils.obtainAppComponentFromContext(context).gson().fromJson(httpResult, new TypeToken>() { @@ -87,13 +90,14 @@ public Response onHttpResultResponse(String httpResult, Interceptor.Chain chain, /** * 这里可以在请求服务器之前拿到 {@link Request}, 做一些操作比如给 {@link Request} 统一添加 token 或者 header 以及参数加密等操作 * - * @param chain {@link okhttp3.Interceptor.Chain} + * @param chain {@link okhttp3.Interceptor.Chain} * @param request {@link Request} - * @return + * @return {@link Request} */ + @NonNull @Override - public Request onHttpRequestBefore(Interceptor.Chain chain, Request request) { - /* 如果需要再请求服务器之前做一些操作, 则重新返回一个做过操作的的 Request 如增加 Header, 不做操作则直接返回参数 request + public Request onHttpRequestBefore(@NonNull Interceptor.Chain chain, @NonNull Request request) { + /* 如果需要在请求服务器之前做一些操作, 则重新构建一个做过操作的 Request 并 return, 如增加 Header、Params 等请求信息, 不做操作则直接返回参数 request return chain.request().newBuilder().header("token", tokenId) .build(); */ return request; diff --git a/demo/src/main/java/me/jessyan/mvparms/demo/di/component/UserComponent.java b/demo/src/main/java/me/jessyan/mvparms/demo/di/component/UserComponent.java index e4a888118..629492953 100644 --- a/demo/src/main/java/me/jessyan/mvparms/demo/di/component/UserComponent.java +++ b/demo/src/main/java/me/jessyan/mvparms/demo/di/component/UserComponent.java @@ -18,8 +18,10 @@ import com.jess.arms.di.component.AppComponent; import com.jess.arms.di.scope.ActivityScope; +import dagger.BindsInstance; import dagger.Component; import me.jessyan.mvparms.demo.di.module.UserModule; +import me.jessyan.mvparms.demo.mvp.contract.UserContract; import me.jessyan.mvparms.demo.mvp.ui.activity.UserActivity; /** @@ -36,4 +38,11 @@ @Component(modules = UserModule.class, dependencies = AppComponent.class) public interface UserComponent { void inject(UserActivity activity); + @Component.Builder + interface Builder { + @BindsInstance + UserComponent.Builder view(UserContract.View view); + UserComponent.Builder appComponent(AppComponent appComponent); + UserComponent build(); + } } diff --git a/demo/src/main/java/me/jessyan/mvparms/demo/di/module/UserModule.java b/demo/src/main/java/me/jessyan/mvparms/demo/di/module/UserModule.java index 896f9c900..0543a4b89 100644 --- a/demo/src/main/java/me/jessyan/mvparms/demo/di/module/UserModule.java +++ b/demo/src/main/java/me/jessyan/mvparms/demo/di/module/UserModule.java @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.List; +import dagger.Binds; import dagger.Module; import dagger.Provides; import me.jessyan.mvparms.demo.mvp.contract.UserContract; @@ -43,51 +44,32 @@ * ================================================ */ @Module -public class UserModule { - private UserContract.View view; +public abstract class UserModule { - /** - * 构建 UserModule 时,将 View 的实现类传进来,这样就可以提供 View 的实现类给 Presenter - * - * @param view - */ - public UserModule(UserContract.View view) { - this.view = view; - } - - @ActivityScope - @Provides - UserContract.View provideUserView() { - return this.view; - } - - @ActivityScope - @Provides - UserContract.Model provideUserModel(UserModel model) { - return model; - } + @Binds + abstract UserContract.Model bindUserModel(UserModel model); @ActivityScope @Provides - RxPermissions provideRxPermissions() { + static RxPermissions provideRxPermissions(UserContract.View view) { return new RxPermissions((FragmentActivity) view.getActivity()); } @ActivityScope @Provides - RecyclerView.LayoutManager provideLayoutManager() { + static RecyclerView.LayoutManager provideLayoutManager(UserContract.View view) { return new GridLayoutManager(view.getActivity(), 2); } @ActivityScope @Provides - List provideUserList() { + static List provideUserList() { return new ArrayList<>(); } @ActivityScope @Provides - RecyclerView.Adapter provideUserAdapter(List list){ + static RecyclerView.Adapter provideUserAdapter(List list){ return new UserAdapter(list); } } diff --git a/demo/src/main/java/me/jessyan/mvparms/demo/mvp/presenter/UserPresenter.java b/demo/src/main/java/me/jessyan/mvparms/demo/mvp/presenter/UserPresenter.java index faee3c507..8c9b898a2 100644 --- a/demo/src/main/java/me/jessyan/mvparms/demo/mvp/presenter/UserPresenter.java +++ b/demo/src/main/java/me/jessyan/mvparms/demo/mvp/presenter/UserPresenter.java @@ -21,19 +21,15 @@ import android.support.v4.app.Fragment; import android.support.v4.app.SupportActivity; import android.support.v7.widget.RecyclerView; - import com.jess.arms.di.scope.ActivityScope; import com.jess.arms.integration.AppManager; import com.jess.arms.mvp.BasePresenter; import com.jess.arms.utils.PermissionUtil; import com.jess.arms.utils.RxLifecycleUtils; - -import java.util.List; - -import javax.inject.Inject; - import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; +import java.util.List; +import javax.inject.Inject; import me.jessyan.mvparms.demo.mvp.contract.UserContract; import me.jessyan.mvparms.demo.mvp.model.entity.User; import me.jessyan.rxerrorhandler.core.RxErrorHandler; diff --git a/demo/src/main/java/me/jessyan/mvparms/demo/mvp/ui/activity/UserActivity.java b/demo/src/main/java/me/jessyan/mvparms/demo/mvp/ui/activity/UserActivity.java index 40d104584..092984634 100644 --- a/demo/src/main/java/me/jessyan/mvparms/demo/mvp/ui/activity/UserActivity.java +++ b/demo/src/main/java/me/jessyan/mvparms/demo/mvp/ui/activity/UserActivity.java @@ -35,7 +35,6 @@ import butterknife.BindView; import me.jessyan.mvparms.demo.R; import me.jessyan.mvparms.demo.di.component.DaggerUserComponent; -import me.jessyan.mvparms.demo.di.module.UserModule; import me.jessyan.mvparms.demo.mvp.contract.UserContract; import me.jessyan.mvparms.demo.mvp.presenter.UserPresenter; import timber.log.Timber; @@ -74,7 +73,7 @@ public void setupActivityComponent(@NonNull AppComponent appComponent) { DaggerUserComponent .builder() .appComponent(appComponent) - .userModule(new UserModule(this)) + .view(this) .build() .inject(this); } diff --git a/demo/src/main/java/me/jessyan/mvparms/demo/mvp/ui/adapter/UserAdapter.java b/demo/src/main/java/me/jessyan/mvparms/demo/mvp/ui/adapter/UserAdapter.java index 21810ec85..9015cc045 100644 --- a/demo/src/main/java/me/jessyan/mvparms/demo/mvp/ui/adapter/UserAdapter.java +++ b/demo/src/main/java/me/jessyan/mvparms/demo/mvp/ui/adapter/UserAdapter.java @@ -15,6 +15,7 @@ */ package me.jessyan.mvparms.demo.mvp.ui.adapter; +import android.support.annotation.NonNull; import android.view.View; import com.jess.arms.base.BaseHolder; @@ -36,12 +37,14 @@ * ================================================ */ public class UserAdapter extends DefaultAdapter { + public UserAdapter(List infos) { super(infos); } + @NonNull @Override - public BaseHolder getHolder(View v, int viewType) { + public BaseHolder getHolder(@NonNull View v, int viewType) { return new UserItemHolder(v); } diff --git a/demo/src/main/java/me/jessyan/mvparms/demo/mvp/ui/holder/UserItemHolder.java b/demo/src/main/java/me/jessyan/mvparms/demo/mvp/ui/holder/UserItemHolder.java index bc8140b0b..81dadc1d5 100644 --- a/demo/src/main/java/me/jessyan/mvparms/demo/mvp/ui/holder/UserItemHolder.java +++ b/demo/src/main/java/me/jessyan/mvparms/demo/mvp/ui/holder/UserItemHolder.java @@ -15,6 +15,7 @@ */ package me.jessyan.mvparms.demo.mvp.ui.holder; +import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.ImageView; @@ -28,7 +29,6 @@ import com.jess.arms.utils.ArmsUtils; import butterknife.BindView; -import io.reactivex.Observable; import me.jessyan.mvparms.demo.R; import me.jessyan.mvparms.demo.mvp.model.entity.User; @@ -48,19 +48,21 @@ public class UserItemHolder extends BaseHolder { @BindView(R.id.tv_name) TextView mName; private AppComponent mAppComponent; - private ImageLoader mImageLoader;//用于加载图片的管理类,默认使用 Glide,使用策略模式,可替换框架 + /** + * 用于加载图片的管理类, 默认使用 Glide, 使用策略模式, 可替换框架 + */ + private ImageLoader mImageLoader; public UserItemHolder(View itemView) { super(itemView); - //可以在任何可以拿到 Context 的地方,拿到 AppComponent,从而得到用 Dagger 管理的单例对象 + //可以在任何可以拿到 Context 的地方, 拿到 AppComponent, 从而得到用 Dagger 管理的单例对象 mAppComponent = ArmsUtils.obtainAppComponentFromContext(itemView.getContext()); mImageLoader = mAppComponent.imageLoader(); } @Override - public void setData(User data, int position) { - Observable.just(data.getLogin()) - .subscribe(s -> mName.setText(s)); + public void setData(@NonNull User data, int position) { + mName.setText(data.getLogin()); //itemView 的 Context 就是 Activity, Glide 会自动处理并和该 Activity 的生命周期绑定 mImageLoader.loadImage(itemView.getContext(), @@ -71,7 +73,6 @@ public void setData(User data, int position) { .build()); } - /** * 在 Activity 的 onDestroy 中使用 {@link DefaultAdapter#releaseAllHolder(RecyclerView)} 方法 (super.onDestroy() 之前) * {@link BaseHolder#onRelease()} 才会被调用, 可以在此方法中释放一些资源 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8c59bf4e8..2601058c8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Sep 26 09:42:46 CST 2018 +#Mon Jul 08 16:45:50 CST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/image/official.jpeg b/image/official.jpeg new file mode 100644 index 000000000..82f9d253a Binary files /dev/null and b/image/official.jpeg differ diff --git a/image/tianfutong_logo.png b/image/tianfutong_logo.png new file mode 100644 index 000000000..b54f49d40 Binary files /dev/null and b/image/tianfutong_logo.png differ