diff --git a/.gitignore b/.gitignore index c6cbe56..72f62ab 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ .DS_Store /build /captures +.idea \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 96cc43e..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3..0000000 --- a/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 97626ba..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index 7ac24c7..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 1e4142f..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - C:\Users\WuXiaolong\AppData\Roaming\Subversion - - - - - - 1.8 - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 55468bd..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 796b96d..d0b97c6 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ /build +*.iml \ No newline at end of file diff --git a/app/app.iml b/app/app.iml deleted file mode 100644 index 6c8a199..0000000 --- a/app/app.iml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index a0053ff..0e2895b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,34 +1,44 @@ apply plugin: 'com.android.application' +apply plugin: 'com.jakewharton.butterknife' android { - compileSdkVersion 25 - buildToolsVersion "25.0.3" + compileSdkVersion 27 + buildToolsVersion "27.0.3" defaultConfig { applicationId "com.wuxiaolong.androidmvpsample" minSdkVersion 14 - targetSdkVersion 22 - versionCode 20 - versionName "2.0" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } + targetSdkVersion 27 + versionCode 1 } } +ext { + androidutilsVersion = '1.0.5' + appcompatVersion = '27.1.0' + butterknifeVersion = '8.4.0' + retrofitVersion = '2.3.0' + + logginginterceptor = '3.9.1' + + rxjavaVersion = '2.1.11' + rxandroidVersion = "2.0.2" +} + dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - compile 'com.android.support:appcompat-v7:25.3.1' - compile 'com.wuxiaolong.androidutils:androidutils:1.0.5' - compile 'com.jakewharton:butterknife:7.0.1' - compile 'com.squareup.retrofit2:retrofit:2.0.2' - compile 'com.squareup.okhttp3:logging-interceptor:3.1.2' - compile 'com.squareup.retrofit2:converter-gson:2.0.2' - compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2' - compile 'io.reactivex:rxandroid:1.1.0' - compile 'io.reactivex:rxjava:1.1.0' + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation "com.wuxiaolong.androidutils:androidutils:$androidutilsVersion" + + implementation "com.android.support:appcompat-v7:$appcompatVersion" +// //butterknife + //noinspection GradleDependency + implementation "com.jakewharton:butterknife:$butterknifeVersion" + annotationProcessor "com.jakewharton:butterknife-compiler:$butterknifeVersion" + implementation "com.squareup.retrofit2:retrofit:$retrofitVersion" + implementation "com.squareup.okhttp3:logging-interceptor:$logginginterceptor" + implementation "com.squareup.retrofit2:converter-gson:$retrofitVersion" + implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofitVersion" + implementation "io.reactivex.rxjava2:rxandroid:$rxandroidVersion" + implementation "io.reactivex.rxjava2:rxjava:$rxjavaVersion" } diff --git a/app/src/main/java/com/wuxiaolong/androidmvpsample/mvp/other/BasePresenter.java b/app/src/main/java/com/wuxiaolong/androidmvpsample/mvp/other/BasePresenter.java index 12d7e62..c2c4ccb 100644 --- a/app/src/main/java/com/wuxiaolong/androidmvpsample/mvp/other/BasePresenter.java +++ b/app/src/main/java/com/wuxiaolong/androidmvpsample/mvp/other/BasePresenter.java @@ -3,11 +3,11 @@ package com.wuxiaolong.androidmvpsample.mvp.other; import com.wuxiaolong.androidmvpsample.retrofit.ApiStores; import com.wuxiaolong.androidmvpsample.retrofit.ApiClient; -import rx.Observable; -import rx.Subscriber; -import rx.android.schedulers.AndroidSchedulers; -import rx.schedulers.Schedulers; -import rx.subscriptions.CompositeSubscription; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.observers.DisposableObserver; +import io.reactivex.schedulers.Schedulers; /** @@ -19,7 +19,7 @@ import rx.subscriptions.CompositeSubscription; public class BasePresenter { public V mvpView; protected ApiStores apiStores; - private CompositeSubscription mCompositeSubscription; + private CompositeDisposable mCompositeDisposable; public void attachView(V mvpView) { this.mvpView = mvpView; @@ -29,25 +29,27 @@ public class BasePresenter { public void detachView() { this.mvpView = null; - onUnsubscribe(); + onUnSubscribe(); } - //RXjava取消注册,以避免内存泄露 - public void onUnsubscribe() { - if (mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) { - mCompositeSubscription.unsubscribe(); + //RxJava取消注册,以避免内存泄露 + public void onUnSubscribe() { + if (mCompositeDisposable != null) { + mCompositeDisposable.dispose(); } } - public void addSubscription(Observable observable, Subscriber subscriber) { - if (mCompositeSubscription == null) { - mCompositeSubscription = new CompositeSubscription(); + public void addSubscription(Observable observable, DisposableObserver observer) { + if (mCompositeDisposable == null) { + mCompositeDisposable = new CompositeDisposable(); } - mCompositeSubscription.add(observable - .subscribeOn(Schedulers.io()) + + mCompositeDisposable.add(observer); + + observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(subscriber)); + .subscribeWith(observer); } } diff --git a/app/src/main/java/com/wuxiaolong/androidmvpsample/retrofit/ApiCallback.java b/app/src/main/java/com/wuxiaolong/androidmvpsample/retrofit/ApiCallback.java index 646a0f0..862a4d0 100644 --- a/app/src/main/java/com/wuxiaolong/androidmvpsample/retrofit/ApiCallback.java +++ b/app/src/main/java/com/wuxiaolong/androidmvpsample/retrofit/ApiCallback.java @@ -3,8 +3,10 @@ package com.wuxiaolong.androidmvpsample.retrofit; import com.wuxiaolong.androidutils.library.LogUtil; -import retrofit2.adapter.rxjava.HttpException; -import rx.Subscriber; + +import io.reactivex.observers.DisposableObserver; +import retrofit2.HttpException; + /** * Created by WuXiaolong on 2016/9/22. @@ -12,7 +14,7 @@ import rx.Subscriber; * 微信公众号:吴小龙同学 * 个人博客:http://wuxiaolong.me/ */ -public abstract class ApiCallback extends Subscriber { +public abstract class ApiCallback extends DisposableObserver { public abstract void onSuccess(M model); @@ -50,7 +52,7 @@ public abstract class ApiCallback extends Subscriber { } @Override - public void onCompleted() { + public void onComplete() { onFinish(); } } diff --git a/app/src/main/java/com/wuxiaolong/androidmvpsample/retrofit/ApiClient.java b/app/src/main/java/com/wuxiaolong/androidmvpsample/retrofit/ApiClient.java index 958c8da..0a0f7b3 100644 --- a/app/src/main/java/com/wuxiaolong/androidmvpsample/retrofit/ApiClient.java +++ b/app/src/main/java/com/wuxiaolong/androidmvpsample/retrofit/ApiClient.java @@ -5,7 +5,7 @@ import com.wuxiaolong.androidmvpsample.BuildConfig; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; -import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** @@ -32,7 +32,7 @@ public class ApiClient { mRetrofit = new Retrofit.Builder() .baseUrl(ApiStores.API_SERVER_URL) .addConverterFactory(GsonConverterFactory.create()) - .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(okHttpClient) .build(); } diff --git a/app/src/main/java/com/wuxiaolong/androidmvpsample/retrofit/ApiStores.java b/app/src/main/java/com/wuxiaolong/androidmvpsample/retrofit/ApiStores.java index 670cfc4..2acd732 100644 --- a/app/src/main/java/com/wuxiaolong/androidmvpsample/retrofit/ApiStores.java +++ b/app/src/main/java/com/wuxiaolong/androidmvpsample/retrofit/ApiStores.java @@ -2,10 +2,10 @@ package com.wuxiaolong.androidmvpsample.retrofit; import com.wuxiaolong.androidmvpsample.mvp.main.MainModel; +import io.reactivex.Observable; import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.Path; -import rx.Observable; /** * Created by WuXiaolong on 2016/3/24. diff --git a/app/src/main/java/com/wuxiaolong/androidmvpsample/ui/BaseActivity.java b/app/src/main/java/com/wuxiaolong/androidmvpsample/ui/BaseActivity.java index c449c73..29887ad 100644 --- a/app/src/main/java/com/wuxiaolong/androidmvpsample/ui/BaseActivity.java +++ b/app/src/main/java/com/wuxiaolong/androidmvpsample/ui/BaseActivity.java @@ -21,13 +21,13 @@ import java.util.ArrayList; import java.util.List; import butterknife.ButterKnife; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; +import io.reactivex.observers.DisposableObserver; +import io.reactivex.schedulers.Schedulers; import retrofit2.Call; -import rx.Observable; -import rx.Subscriber; -import rx.Subscription; -import rx.android.schedulers.AndroidSchedulers; -import rx.schedulers.Schedulers; -import rx.subscriptions.CompositeSubscription; /** * Created by WuXiaolong on 2015/9/23. @@ -35,9 +35,9 @@ import rx.subscriptions.CompositeSubscription; * 微信公众号:吴小龙同学 * 个人博客:http://wuxiaolong.me/ */ -public class BaseActivity extends AppCompatActivity { +public abstract class BaseActivity extends AppCompatActivity { public Activity mActivity; - private CompositeSubscription mCompositeSubscription; + private CompositeDisposable mCompositeDisposable; private List calls; @Override @@ -60,7 +60,6 @@ public class BaseActivity extends AppCompatActivity { super.setContentView(view, params); ButterKnife.bind(this); mActivity = this; - } @@ -93,36 +92,37 @@ public class BaseActivity extends AppCompatActivity { } - public void addSubscription(Observable observable, Subscriber subscriber) { - if (mCompositeSubscription == null) { - mCompositeSubscription = new CompositeSubscription(); + public void addSubscription(Observable observable, DisposableObserver observer) { + if (mCompositeDisposable == null) { + mCompositeDisposable = new CompositeDisposable(); } - mCompositeSubscription.add(observable - .subscribeOn(Schedulers.io()) + mCompositeDisposable.add(observer); + + observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(subscriber)); + .subscribe(observer); } - public void addSubscription(Subscription subscription) { - if (mCompositeSubscription == null) { - mCompositeSubscription = new CompositeSubscription(); + public void addSubscription(Disposable disposable) { + if (mCompositeDisposable == null) { + mCompositeDisposable = new CompositeDisposable(); } - mCompositeSubscription.add(subscription); + mCompositeDisposable.add(disposable); } public void onUnsubscribe() { - LogUtil.d("onUnsubscribe"); + LogUtil.d("onUnSubscribe"); //取消注册,以避免内存泄露 - if (mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) - mCompositeSubscription.unsubscribe(); + if (mCompositeDisposable != null) + mCompositeDisposable.dispose(); } public Toolbar initToolBar(String title) { - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); if (toolbar != null) { setSupportActionBar(toolbar); - TextView toolbaTitle = (TextView) toolbar.findViewById(R.id.toolbar_title); + TextView toolbaTitle = toolbar.findViewById(R.id.toolbar_title); toolbaTitle.setText(title); } ActionBar actionBar = getSupportActionBar(); diff --git a/app/src/main/java/com/wuxiaolong/androidmvpsample/ui/BaseFragment.java b/app/src/main/java/com/wuxiaolong/androidmvpsample/ui/BaseFragment.java index e6b4624..428d1c3 100644 --- a/app/src/main/java/com/wuxiaolong/androidmvpsample/ui/BaseFragment.java +++ b/app/src/main/java/com/wuxiaolong/androidmvpsample/ui/BaseFragment.java @@ -11,9 +11,11 @@ import android.widget.Toast; import com.wuxiaolong.androidmvpsample.R; +import org.reactivestreams.Subscription; + import butterknife.ButterKnife; -import rx.Subscription; -import rx.subscriptions.CompositeSubscription; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.observers.DisposableObserver; /** * Created by WuXiaolong on 2015/9/23. @@ -55,19 +57,19 @@ public class BaseFragment extends Fragment { onUnsubscribe(); } - private CompositeSubscription mCompositeSubscription; + private CompositeDisposable mCompositeDisposable; public void onUnsubscribe() { //取消注册,以避免内存泄露 - if (mCompositeSubscription != null) { - mCompositeSubscription.unsubscribe(); + if (mCompositeDisposable != null) { + mCompositeDisposable.dispose(); } } - public void addSubscription(Subscription subscription) { -// if (mCompositeSubscription == null) { - mCompositeSubscription = new CompositeSubscription(); + public void addSubscription(DisposableObserver observer) { +// if (mCompositeDisposable == null) { + mCompositeDisposable = new CompositeDisposable(); // } - mCompositeSubscription.add(subscription); + mCompositeDisposable.add(observer); } } diff --git a/app/src/main/java/com/wuxiaolong/androidmvpsample/ui/MainActivity.java b/app/src/main/java/com/wuxiaolong/androidmvpsample/ui/MainActivity.java index dbaef35..ece998c 100644 --- a/app/src/main/java/com/wuxiaolong/androidmvpsample/ui/MainActivity.java +++ b/app/src/main/java/com/wuxiaolong/androidmvpsample/ui/MainActivity.java @@ -12,7 +12,7 @@ import com.wuxiaolong.androidmvpsample.mvp.other.MvpActivity; import com.wuxiaolong.androidmvpsample.retrofit.ApiCallback; import com.wuxiaolong.androidmvpsample.retrofit.RetrofitCallback; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import retrofit2.Call; @@ -26,16 +26,14 @@ import retrofit2.Call; */ public class MainActivity extends MvpActivity implements MainView { - @Bind(R.id.text) + @BindView(R.id.text) TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - ButterKnife.bind(this); initToolBarAsHome("MVP+Retrofit+Rxjava"); - } @Override @@ -64,7 +62,7 @@ public class MainActivity extends MvpActivity implements MainView loadDataByRetrofit(); break; case R.id.button1: - loadDataByRetrofitRxjava(); + loadDataByRetrofitRxJava(); break; case R.id.button2: //请求接口 @@ -101,10 +99,12 @@ public class MainActivity extends MvpActivity implements MainView } //全国+国外主要城市代码http://mobile.weather.com.cn/js/citylist.xml - private void loadDataByRetrofitRxjava() { + private void loadDataByRetrofitRxJava() { showProgressDialog(); - addSubscription(apiStores().loadDataByRetrofitRxjava("101220602"), + addSubscription( + apiStores().loadDataByRetrofitRxjava("101220602"), new ApiCallback() { + @Override public void onSuccess(MainModel model) { dataSuccess(model); @@ -113,7 +113,6 @@ public class MainActivity extends MvpActivity implements MainView @Override public void onFailure(String msg) { toastShow(msg); - } @Override diff --git a/build.gradle b/build.gradle index 072e693..7e4372b 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,11 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.1' + classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -15,5 +17,6 @@ buildscript { allprojects { repositories { jcenter() + google() } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f5eaf75..2e65a05 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/screenshots.png b/screenshots.png deleted file mode 100644 index db5d55b..0000000 Binary files a/screenshots.png and /dev/null differ diff --git a/screenshots.webp b/screenshots.webp new file mode 100644 index 0000000..8094be6 Binary files /dev/null and b/screenshots.webp differ