提交 208f6889 编写于 作者: J jessyan

Upgrade to Rxjava2 and release to v2.0.0

上级 6d0f0a9d
......@@ -23,6 +23,6 @@ android:
script:
- ./gradlew clean
# - ./gradlew install
# - ./gradlew bintrayUpload
- ./gradlew install
- ./gradlew bintrayUpload
- ./gradlew assembleDebug
\ No newline at end of file
# MVPArms
[ ![Bintray](https://img.shields.io/badge/bintray-v1.6.3-brightgreen.svg) ](https://bintray.com/jessyancoding/maven/MVPArms/1.6.3/link)
[ ![Bintray](https://img.shields.io/badge/bintray-v2.0.0-brightgreen.svg) ](https://bintray.com/jessyancoding/maven/MVPArms/2.0.0/link)
[ ![Build Status](https://travis-ci.org/JessYanCoding/MVPArms.svg?branch=master) ](https://travis-ci.org/JessYanCoding/MVPArms)
[ ![API](https://img.shields.io/badge/API-15%2B-blue.svg?style=flat-square) ](https://developer.android.com/about/versions/android-4.0.3.html)
[ ![License](http://img.shields.io/badge/License-Apache%202.0-blue.svg?style=flat-square) ](http://www.apache.org/licenses/LICENSE-2.0)
......
# MVPArms
[ ![Bintray](https://img.shields.io/badge/bintray-v1.6.3-brightgreen.svg) ](https://bintray.com/jessyancoding/maven/MVPArms/1.6.3/link)
[ ![Bintray](https://img.shields.io/badge/bintray-v2.0.0-brightgreen.svg) ](https://bintray.com/jessyancoding/maven/MVPArms/2.0.0/link)
[ ![Build Status](https://travis-ci.org/JessYanCoding/MVPArms.svg?branch=master) ](https://travis-ci.org/JessYanCoding/MVPArms)
[ ![API](https://img.shields.io/badge/API-15%2B-blue.svg?style=flat-square) ](https://developer.android.com/about/versions/android-4.0.3.html)
[ ![License](http://img.shields.io/badge/License-Apache%202.0-blue.svg?style=flat-square) ](http://www.apache.org/licenses/LICENSE-2.0)
......
package me.jessyan.mvparms.demo.app.utils;
import com.jess.arms.mvp.IView;
import com.trello.rxlifecycle.LifecycleTransformer;
import com.trello.rxlifecycle.components.support.RxAppCompatActivity;
import com.trello.rxlifecycle.components.support.RxFragment;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action0;
import rx.schedulers.Schedulers;
import com.trello.rxlifecycle2.LifecycleTransformer;
import com.trello.rxlifecycle2.components.support.RxAppCompatActivity;
import com.trello.rxlifecycle2.components.support.RxFragment;
import io.reactivex.Observable;
import io.reactivex.ObservableTransformer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Action;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
/**
* Created by jess on 11/10/2016 16:39
......@@ -17,31 +21,30 @@ import rx.schedulers.Schedulers;
public class RxUtils {
public static <T> Observable.Transformer<T, T> applySchedulers(final IView view) {
return new Observable.Transformer<T, T>() {
public static <T> ObservableTransformer<T, T> applySchedulers(final IView view) {
return new ObservableTransformer<T, T>() {
@Override
public Observable<T> call(Observable<T> observable) {
public Observable<T> apply(Observable<T> observable) {
return observable.subscribeOn(Schedulers.io())
.doOnSubscribe(new Action0() {
.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void call() {//显示进度条
view.showLoading();
public void accept(@NonNull Disposable disposable) throws Exception {
view.showLoading();//显示进度条
}
})
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(new Action0() {
.doAfterTerminate(new Action() {
@Override
public void call() {
public void run() {
view.hideLoading();//隐藏进度条
}
}).compose(RxUtils.<T>bindToLifecycle(view));
}).compose(RxUtils.bindToLifecycle(view));
}
};
}
public static <T> LifecycleTransformer<T> bindToLifecycle(IView view) {
if (view instanceof RxAppCompatActivity) {
return ((RxAppCompatActivity) view).bindToLifecycle();
......
package me.jessyan.mvparms.demo.mvp.contract;
import com.jess.arms.base.DefaultAdapter;
import com.jess.arms.mvp.IView;
import com.jess.arms.mvp.IModel;
import com.tbruyelle.rxpermissions.RxPermissions;
import com.jess.arms.mvp.IView;
import com.tbruyelle.rxpermissions2.RxPermissions;
import java.util.List;
import io.reactivex.Observable;
import me.jessyan.mvparms.demo.mvp.model.entity.User;
import rx.Observable;
/**
* Created by jess on 9/4/16 10:47
......
......@@ -8,15 +8,17 @@ import java.util.List;
import javax.inject.Inject;
import io.rx_cache.DynamicKey;
import io.rx_cache.EvictDynamicKey;
import io.rx_cache.Reply;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Function;
import io.rx_cache2.DynamicKey;
import io.rx_cache2.EvictDynamicKey;
import io.rx_cache2.Reply;
import me.jessyan.mvparms.demo.mvp.contract.UserContract;
import me.jessyan.mvparms.demo.mvp.model.api.cache.CommonCache;
import me.jessyan.mvparms.demo.mvp.model.api.service.UserService;
import me.jessyan.mvparms.demo.mvp.model.entity.User;
import rx.Observable;
import rx.functions.Func1;
/**
* Created by jess on 9/4/16 10:56
......@@ -40,9 +42,9 @@ public class UserModel extends BaseModel implements UserContract.Model {
.getUsers(users
, new DynamicKey(lastIdQueried)
, new EvictDynamicKey(update))
.flatMap(new Func1<Reply<List<User>>, Observable<List<User>>>() {
.flatMap(new Function<Reply<List<User>>, ObservableSource<List<User>>>() {
@Override
public Observable<List<User>> call(Reply<List<User>> listReply) {
public ObservableSource<List<User>> apply(@NonNull Reply<List<User>> listReply) throws Exception {
return Observable.just(listReply.getData());
}
});
......
......@@ -3,12 +3,12 @@ package me.jessyan.mvparms.demo.mvp.model.api.cache;
import java.util.List;
import java.util.concurrent.TimeUnit;
import io.rx_cache.DynamicKey;
import io.rx_cache.EvictProvider;
import io.rx_cache.LifeCache;
import io.rx_cache.Reply;
import io.reactivex.Observable;
import io.rx_cache2.DynamicKey;
import io.rx_cache2.EvictProvider;
import io.rx_cache2.LifeCache;
import io.rx_cache2.Reply;
import me.jessyan.mvparms.demo.mvp.model.entity.User;
import rx.Observable;
/**
* Created by jess on 8/30/16 13:53
......@@ -19,6 +19,6 @@ public interface CommonCache {
@LifeCache(duration = 2, timeUnit = TimeUnit.MINUTES)
Observable<Reply<List<User>>> getUsers(Observable<List<User>> oUsers, DynamicKey idLastUserQueried, EvictProvider evictProvider);
Observable<Reply<List<User>>> getUsers(Observable<List<User>> users, DynamicKey idLastUserQueried, EvictProvider evictProvider);
}
......@@ -2,11 +2,11 @@ package me.jessyan.mvparms.demo.mvp.model.api.service;
import java.util.List;
import io.reactivex.Observable;
import me.jessyan.mvparms.demo.mvp.model.entity.User;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.Query;
import rx.Observable;
/**
* 存放关于用户的一些api
......
......@@ -13,6 +13,8 @@ import java.util.List;
import javax.inject.Inject;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import me.jessyan.mvparms.demo.app.utils.RxUtils;
import me.jessyan.mvparms.demo.mvp.contract.UserContract;
import me.jessyan.mvparms.demo.mvp.model.entity.User;
......@@ -20,8 +22,6 @@ import me.jessyan.mvparms.demo.mvp.ui.adapter.UserAdapter;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import me.jessyan.rxerrorhandler.handler.RetryWithDelay;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Created by jess on 9/4/16 10:59
......@@ -71,7 +71,7 @@ public class UserPresenter extends BasePresenter<UserContract.Model, UserContrac
mModel.getUsers(lastUserId, isEvictCache)
.subscribeOn(Schedulers.io())
.retryWhen(new RetryWithDelay(3, 2))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
.doOnSubscribe(() -> {
.doOnSubscribe(disposable -> {
if (pullToRefresh)
mRootView.showLoading();//显示上拉刷新的进度条
else
......
......@@ -11,16 +11,16 @@ import com.jess.arms.base.DefaultAdapter;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.UiUtils;
import com.paginate.Paginate;
import com.tbruyelle.rxpermissions.RxPermissions;
import com.tbruyelle.rxpermissions2.RxPermissions;
import butterknife.BindView;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
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 rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import timber.log.Timber;
......
......@@ -5,7 +5,6 @@ import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.jakewharton.rxbinding.widget.RxTextView;
import com.jess.arms.base.App;
import com.jess.arms.base.BaseHolder;
import com.jess.arms.di.component.AppComponent;
......@@ -13,9 +12,9 @@ import com.jess.arms.widget.imageloader.ImageLoader;
import com.jess.arms.widget.imageloader.glide.GlideImageConfig;
import butterknife.BindView;
import io.reactivex.Observable;
import me.jessyan.mvparms.demo.R;
import me.jessyan.mvparms.demo.mvp.model.entity.User;
import rx.Observable;
/**
* Created by jess on 9/4/16 12:56
......@@ -42,7 +41,7 @@ public class UserItemHolder extends BaseHolder<User> {
@Override
public void setData(User data, int position) {
Observable.just(data.getLogin())
.subscribe(RxTextView.text(mName));
.subscribe(s -> mName.setText(s));
mImageLoader.loadImage(mAppComponent.appManager().getCurrentActivity() == null
? mAppComponent.Application() : mAppComponent.appManager().getCurrentActivity(),
......
......@@ -65,29 +65,29 @@ dependencies {
//rx
compile rootProject.ext.dependencies["rxjava"]
compile (rootProject.ext.dependencies["rxandroid"]){
compile rootProject.ext.dependencies["rxjava2"]
compile (rootProject.ext.dependencies["rxandroid2"]){
exclude module: 'rxjava'
}
compile (rootProject.ext.dependencies["rxcache"]){
compile (rootProject.ext.dependencies["rxcache2"]){
exclude module: 'rxjava'
exclude module: 'dagger'
}
compile (rootProject.ext.dependencies["rxcache-jolyglot-gson"]){
exclude module: 'gson'
}
compile (rootProject.ext.dependencies["rxlifecycle"]){
compile (rootProject.ext.dependencies["rxlifecycle2"]){
exclude module: 'rxjava'
}
compile (rootProject.ext.dependencies["rxlifecycle-components"]){
compile (rootProject.ext.dependencies["rxlifecycle2-components"]){
exclude module: 'support-v4'
exclude module: 'appcompat-v7'
exclude module: 'support-annotations'
exclude module: 'rxjava'
exclude module: 'rxandroid'
}
compile rootProject.ext.dependencies["rxpermissions"]
compile (rootProject.ext.dependencies['rxerrorhandler']){
compile rootProject.ext.dependencies["rxpermissions2"]
compile (rootProject.ext.dependencies['rxerrorhandler2']){
exclude module: 'rxjava'
}
......@@ -99,7 +99,7 @@ dependencies {
compile (rootProject.ext.dependencies["retrofit-converter-gson"]){
exclude module: 'gson'
}
compile (rootProject.ext.dependencies["retrofit-adapter-rxjava"]){
compile (rootProject.ext.dependencies["retrofit-adapter-rxjava2"]){
exclude module: 'rxjava'
}
compile rootProject.ext.dependencies["okhttp3"]
......
......@@ -6,7 +6,7 @@ import android.view.View;
import com.jess.arms.base.delegate.IActivity;
import com.jess.arms.mvp.IPresenter;
import com.trello.rxlifecycle.components.support.RxAppCompatActivity;
import com.trello.rxlifecycle2.components.support.RxAppCompatActivity;
import com.zhy.autolayout.AutoFrameLayout;
import com.zhy.autolayout.AutoLinearLayout;
import com.zhy.autolayout.AutoRelativeLayout;
......
......@@ -8,7 +8,7 @@ import android.view.ViewGroup;
import com.jess.arms.base.delegate.IFragment;
import com.jess.arms.mvp.IPresenter;
import com.trello.rxlifecycle.components.support.RxFragment;
import com.trello.rxlifecycle2.components.support.RxFragment;
import javax.inject.Inject;
......
......@@ -7,13 +7,15 @@ import android.support.annotation.Nullable;
import org.simple.eventbus.EventBus;
import rx.Subscription;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
/**
* Created by jess on 16/5/6.
*/
public abstract class BaseService extends Service {
protected final String TAG = this.getClass().getSimpleName();
protected CompositeDisposable mCompositeDisposable;
@Nullable
@Override
......@@ -32,11 +34,20 @@ public abstract class BaseService extends Service {
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
unDispose();//解除订阅
this.mCompositeDisposable = null;
}
public void unSubscribe(Subscription subscription) {
if (subscription != null && !subscription.isUnsubscribed()) {
subscription.unsubscribe();//保证service结束时取消所有正在执行的订阅
protected void addDispose(Disposable disposable) {
if (mCompositeDisposable == null) {
mCompositeDisposable = new CompositeDisposable();
}
mCompositeDisposable.add(disposable);//将所有subscription放入,集中处理
}
protected void unDispose() {
if (mCompositeDisposable != null) {
mCompositeDisposable.clear();//保证activity结束时取消所有正在执行的订阅
}
}
......
......@@ -16,7 +16,7 @@ import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import io.rx_cache.internal.RxCache;
import io.rx_cache2.internal.RxCache;
import io.victoralbertos.jolyglot.GsonSpeaker;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.listener.ResponseErroListener;
......@@ -24,7 +24,7 @@ import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
......@@ -50,7 +50,7 @@ public class ClientModule {
builder
.baseUrl(httpUrl)//域名
.client(client)//设置okhttp
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//使用rxjava
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//使用rxjava
.addConverterFactory(GsonConverterFactory.create());//使用Gson
configuration.configRetrofit(application, builder);
return builder.build();
......
......@@ -10,7 +10,7 @@ import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.rx_cache.internal.RxCache;
import io.rx_cache2.internal.RxCache;
import retrofit2.Retrofit;
/**
......
......@@ -2,15 +2,15 @@ package com.jess.arms.mvp;
import org.simple.eventbus.EventBus;
import rx.Subscription;
import rx.subscriptions.CompositeSubscription;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
/**
* Created by jess on 16/4/28.
*/
public class BasePresenter<M extends IModel, V extends IView> implements IPresenter {
protected final String TAG = this.getClass().getSimpleName();
protected CompositeSubscription mCompositeSubscription;
protected CompositeDisposable mCompositeDisposable;
protected M mModel;
protected V mRootView;
......@@ -42,12 +42,12 @@ public class BasePresenter<M extends IModel, V extends IView> implements IPresen
public void onDestroy() {
if (useEventBus())//如果要使用eventbus请将此方法返回true
EventBus.getDefault().unregister(this);//解除注册eventbus
unSubscribe();//解除订阅
unDispose();//解除订阅
if (mModel != null)
mModel.onDestroy();
this.mModel = null;
this.mRootView = null;
this.mCompositeSubscription = null;
this.mCompositeDisposable = null;
}
/**
......@@ -60,16 +60,16 @@ public class BasePresenter<M extends IModel, V extends IView> implements IPresen
}
protected void addSubscribe(Subscription subscription) {
if (mCompositeSubscription == null) {
mCompositeSubscription = new CompositeSubscription();
protected void addDispose(Disposable disposable) {
if (mCompositeDisposable == null) {
mCompositeDisposable = new CompositeDisposable();
}
mCompositeSubscription.add(subscription);//将所有subscription放入,集中处理
mCompositeDisposable.add(disposable);//将所有disposable放入,集中处理
}
protected void unSubscribe() {
if (mCompositeSubscription != null) {
mCompositeSubscription.unsubscribe();//保证activity结束时取消所有正在执行的订阅
protected void unDispose() {
if (mCompositeDisposable != null) {
mCompositeDisposable.clear();//保证activity结束时取消所有正在执行的订阅
}
}
......
......@@ -3,7 +3,7 @@ package com.jess.arms.utils;
import android.Manifest;
import com.jess.arms.mvp.IView;
import com.tbruyelle.rxpermissions.RxPermissions;
import com.tbruyelle.rxpermissions2.RxPermissions;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
......
......@@ -11,9 +11,10 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.target.Target;
import com.jess.arms.widget.imageloader.BaseImageLoaderStrategy;
import rx.Observable;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
import io.reactivex.Observable;
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
/**
* Created by jess on 8/5/16 16:28
......@@ -87,9 +88,9 @@ public class GlideImageLoaderStrategy implements BaseImageLoaderStrategy<GlideIm
if (config.isClearDiskCache()) {//清除本地缓存
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Action1<Integer>() {
.subscribe(new Consumer<Integer>() {
@Override
public void call(Integer integer) {
public void accept(@NonNull Integer integer) throws Exception {
Glide.get(ctx).clearDiskCache();
}
});
......
......@@ -5,8 +5,8 @@ ext {
buildToolsVersion : "25.0.2",
minSdkVersion : 15,
targetSdkVersion : 25,
versionCode : 63,
versionName : "1.6.3",
versionCode : 100,
versionName : "2.0.0",
]
version = [
......@@ -15,6 +15,7 @@ ext {
dagger2SdkVersion : "2.10",
butterknifeSdkVersion : "8.5.1",
rxlifecycleSdkVersion : "1.0",
rxlifecycle2SdkVersion : "2.0.1",
espressoSdkVersion : "2.2.2",
canarySdkVersion : "1.5"
]
......@@ -32,9 +33,10 @@ ext {
"retrofit" : "com.squareup.retrofit2:retrofit:${version["retrofitSdkVersion"]}",
"retrofit-converter-gson" : "com.squareup.retrofit2:converter-gson:${version["retrofitSdkVersion"]}",
"retrofit-adapter-rxjava" : "com.squareup.retrofit2:adapter-rxjava:${version["retrofitSdkVersion"]}",
"okhttp3" : "com.squareup.okhttp3:okhttp:3.6.0",
"retrofit-adapter-rxjava2" : "com.squareup.retrofit2:adapter-rxjava2:${version["retrofitSdkVersion"]}",
"okhttp3" : "com.squareup.okhttp3:okhttp:3.7.0",
"okhttp-urlconnection" : "com.squareup.okhttp:okhttp-urlconnection:2.0.0",
"glide" : "com.github.bumptech.glide:glide:3.7.0",
"glide" : "com.github.bumptech.glide:glide:3.8.0",
"picasso" : "com.squareup.picasso:picasso:2.5.2",
//view
......@@ -47,7 +49,7 @@ ext {
"nineoldandroids" : "com.nineoldandroids:library:2.4.0",
"paginate" : "com.github.markomilos:paginate:0.5.1",
//rx
//rx1
"rxandroid" : "io.reactivex:rxandroid:1.2.1",
"rxjava" : "io.reactivex:rxjava:1.2.9",
"rxlifecycle" : "com.trello:rxlifecycle:${version["rxlifecycleSdkVersion"]}",
......@@ -58,6 +60,15 @@ ext {
"rxpermissions" : "com.tbruyelle.rxpermissions:rxpermissions:0.9.3@aar",
"rxerrorhandler" : "me.jessyan:rxerrorhandler:1.0.1",
//rx2
"rxandroid2" : "io.reactivex.rxjava2:rxandroid:2.0.1",
"rxjava2" : "io.reactivex.rxjava2:rxjava:2.1.0",
"rxlifecycle2" : "com.trello.rxlifecycle2:rxlifecycle:${version["rxlifecycle2SdkVersion"]}",
"rxlifecycle2-components" : "com.trello.rxlifecycle2:rxlifecycle-components:${version["rxlifecycle2SdkVersion"]}",
"rxcache2" : "com.github.VictorAlbertos.RxCache:runtime:1.8.0-2.x",
"rxpermissions2" : "com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar",
"rxerrorhandler2" : "me.jessyan:rxerrorhandler:2.0",
//tools
"dagger2" : "com.google.dagger:dagger:${version["dagger2SdkVersion"]}",
"dagger2-compiler" : "com.google.dagger:dagger-compiler:${version["dagger2SdkVersion"]}",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册