- @return fragment
*/
public Fragment getFragment() {
return this;
}
}`
Presenter的基类,
CompositeDisposable主要用途是及时取消订阅,以防止内存泄漏,具体CompositeDisposable的用法可参照[Rxjava关于Disposable你应该知道的事](()
`
public void addDisposable(Disposable subscription) {
//csb 如果解绑了的话添加 sb 需要新的实例否则绑定时无效的
if (mCompositeDisposable == null || mCompositeDisposable.isDisposed()) {
mCompositeDisposable = new CompositeDisposable();
}
mCompositeDisposable.add(subscription);
}
}`
2.1.6 MyApplication
- 封装了一个可以全局获取Context的方法,参考写法自:《第一行代码–第二版》
- 注意:记得在AndroidManifest中注册Application
`package com.users.xucanyou666.rxjava2_retrofit_mvp.base;
import android.app.Application;
import android.content.Context;
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
}`
2.2 工具类 Util
2.2.1 RetrofitManager
Retrofit单例工具类
`
public T createRs(Class ser) {
return mRetrofit.create(ser);
}
}`
2.2.2 RxJavaUtil
RxJava的工具类,执行线程调度工作
`
public static Observable toSubscribe(Observable observable) {
return observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}`
2.3 常量类 Contant
常量池,特别感谢api open网提供的免费API
`
public class StaticQuality {
public static final String BASE_URL=“https://api.gushi.ci/”;
}`
2.4 接口管理器 Contract
这里集中了一些Model层,Presenter层,View层的与诗歌相关的接口
`
void searchSuccess(String author);
}
}`
2.5 实体类 Entity
`
public class PoetryEntity {
private String content; //诗歌内容
private String origin; //来源
private String author; //作者
private String category; //分类
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getOrigin() {
return origin;
}
public void setOrigin(String origin) {
this.origin = origin;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}`
2.6 Retrofit接口 iApiService
`
@GET(“all.json”)
Observable getPoetry();
}`
2.7 视图层 View
2.7.1 MainActivity这里为了减少代码量,方便读者们掌握核心操作,故View层都是用的同一个Presenter和Model,仅作学习参考
需要注意的是,这里BaseMvpActivity中Activity填入的是当前的Activity,Presenter填入的是对应的Presenter
` ` ` ` apply plugin: 'com.android.application' android { compileSdkVersion 28 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } defaultConfig { applicationId "com.users.xucanyou666.rxjava2_retrofit_mvp" minSdkVersion 19 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { // RxJava implementation 'io.reactivex.rxjava2:rxjava:2.1.12' implementation 'com.squareup.retrofit2:retrofit:2.6.0' // Retrofit和jxjava关联 implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' // Retrofit使用Gson转换 implementation 'com.squareup.retrofit2:converter-gson:2.4.0' // RxAndroid implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' //引入ButterKnife implementation "com.jakewharton:butterknife:10.2.0" implementation 'androidx.legacy:legacy-support-v4:1.0.0' annotationProcessor "com.jakewharton:butterknife-compiler:10.2.0" implementation "com.google.android.material:material:1.0.0" implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' } 使用ButterKnife框架的时候 当是androidX的时候,需要implementation 10.2.0版本的ButterKnife //引入ButterKnife implementation "com.jakewharton:butterknife:10.2.0" implementation 'androidx.legacy:legacy-support-v4:1.0.0' annotationProcessor "com.jakewharton:butterknife-compiler:10.2.0" 当是android 28等其他版本的时候,可以导入8.4.0版本的ButterKnife(导入10.2.0版本会出错) implementation 'com.jakewharton:butterknife:8.4.0' annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
public class MainActivity extends BaseMvpActivity
@BindView(R.id.btn_get_poetry)
Button btnGetPoetry;
@BindView(R.id.tv_poetry_author)
TextView tvPoetryAuthor;
@BindView(R.id.btn_goto_fragment)
Button btnGotoFragment;
@BindView(R.id.ll)
LinearLayout ll;
@Override
protected void initViews() {
}
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
@Override
protected PoetryPresenter createPresenter() {
return PoetryPresenter.getInstance();
}
@Override
public void searchSuccess(String author) {
tvPoetryAuthor.setText(author);
}
@Override
public void showProgressDialog() {
}
@Override
public void hideProgressDialog() {
}
@Override
public void onError(String result) {
Toast.makeText(MyApplication.getContext(), result, Toast.LENGTH_SHORT).show();
}
@OnClick({R.id.btn_get_poetry, R.id.btn_goto_fragment})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.btn_get_poetry:
getPresenter().getPoetry();
break;
case R.id.btn_goto_fragment:
startFragment(R.id.ll, new MainFragment());
break;
default:
break;
}
}
}`
2.7.2 MainFragment
public class MainFragment extends BaseFragment implements IPoetryContract.IPoetryView {
@BindView(R.id.btn_get_poetry)
Button btnGetPoetry;
@BindView(R.id.tv_poetry_author)
TextView tvPoetryAuthor;
@Override
public View initView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main, container, false);
}
@Override
public PoetryPresenter initPresenter() {
return PoetryPresenter.getInstance();
}
@Override
public void showProgressDialog() {
}
@Override
public void hideProgressDialog() {
}
@Override
public void onError(String result) {
Toast.makeText(MyApplication.getContext(), result, Toast.LENGTH_SHORT).show();
}
@OnClick(R.id.btn_get_poetry)
public void onViewClicked() {
getPresenter().getPoetry();
}
@Override
public void searchSuccess(String author) {
tvPoetryAuthor.setText(author);
}
}`
2.8 Presenter层
@Override
public void getPoetry() {
Observable observable = mPoetryModel.getPoetry().doOnSubscribe(new Consumer() {
@Override
public void accept(Disposable disposable) throws Exception {
addDisposable(disposable);
}
});
observable = RxJavaUtil.toSubscribe(observable);
observable.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(PoetryEntity poetryEntity) {
mPoetryEntity = poetryEntity;
}
@Override
public void onError(Throwable e) {
getMvpView().onError(e.getMessage());
Log.d(TAG, "onError: " + e.getMessage());
}
@Override
public void onComplete() {
if (mPoetryEntity != null) {
getMvpView().searchSuccess(mPoetryEntity.getAuthor());
}
}
});
}
}`
2.9 Model层
@Override
public Observable getPoetry() {
return RetrofitManager.getInstance().createRs(GetPoetryEntity.class).getPoetry();
}
}`
2.10 app.build.gradle



