前言: 本文的源码是根据一位前辈的帖子加入了本人的理解总结的,如果感觉不错,感谢采用,如果有瑕疵,请及时沟通,我会尽快修复不足。只是喜欢代码,谈不上精通。
正文:
-
导入依赖 项目gradle
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
app的gradle
implementation 'com.github.xiangshu957:mvp:0.0.3'
以下是成熟的第三方依赖库,本人暂时还没有明白为什么不导入下面的依赖会有问题,因为我自己依赖中已经导过了,如果不导的话会出问题,小伙伴们还是受累导一下哈。
implementation 'com.squareup.okhttp3:okhttp:4.7.2'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.3'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.7.2'
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2'
implementation 'com.google.dagger:dagger-android:2.35.1'
implementation 'com.google.dagger:dagger-android-support:2.24'
annotationProcessor 'com.google.dagger:dagger-compiler:2.24'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.24'
implementation 'com.jakewharton:butterknife:8.2.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.2.1'
- Application中的初始化
public class MyApplication extends DaggerApplication {
private static MyApplication context;
@Override
public void onCreate() {
super.onCreate();
context = this;
PreferenceUtil.getInstance().init(this, "test_sp");
RetrofitManager.getInstance(SysCommon.BASE_URL, null, RetrofitApi.class);
}
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
return DaggerAppComponent.builder().application(this).build();
}
public static Context getContext() {
return context;
}
}
-
RetrofitApi接口书写 RetrofitApiService 是我自己写的一个接口,用来初始化Retrofit,所以自定义RetrofitApi一定要extends
public interface RetrofitApi extends RetrofitApiService {
@GET(SysCommon.YM_RUL)
Observable<实体类|字符串|返回的具体结果> getData();
}
- Dagger注入
@Component(modules = {AndroidSupportInjectionModule.class})
public interface AppComponent extends AndroidInjector<MyApplication> {
@Component.Builder
interface Builder{
@BindsInstance
Builder application(Application application);
AppComponent build();
}
}
- Contract契约接口
这里简单的以MainActivity为例
public interface MainContract {
interface View extends BaseView{
void getDataSuccess(TestBean dataJson);
void getDataFail(String message);
}
interface Presenter {
void getData();
}
}
-
Presenter业务逻辑类 presenter中是获取数据的具体实现,简单的来说:MainContract.Presenter中的方法由presenter实现,并且和MainContract.View进行数据传递,一起往下看吧,都在注释里:
public class MainPresenter extends BasePresenter<MainContract.View> implements MainContract.Presenter {
@Inject
public MainPresenter() {
}
@SuppressLint("CheckResult")
@Override
public void getData() {
setOfflineCacheTime(0);
setOnlineCacheTime(0);
observe(((RetrofitApi) apiService()).getData(), false)
.subscribe(s -> {
getView().getDataSuccess(s);
}, throwable -> {
getView().getDataFail(throwable.getMessage());
});
}
}
-
activity中的填空题 到了activity中基本都是填空题了,BaseActivity的泛型是继承了BasePresenter的presenter,并且实现MainContract.View,这样就拥有了presenter的使用权,同时也能知道presenter在工作之后的结果了
public class MainActivity extends BaseActivity<MainPresenter> implements MainContract.View {
@Override
public MainPresenter createPresenter() {
return new MainPresenter();
}
@Override
public int getContentViewId() {
return R.layout.activity_main;
}
@Override
public void setListener() {
mPresenter.getData();
}
@Override
public void processLogic() {
}
@Override
public void registerReceiver() {
}
@Override
public void unRegisterReceiver() {
}
@Override
public void showLoading(String msg) {
}
@Override
public void hideLoading() {
}
@Override
public void getDataSuccess(TestBean dataJson) {
LogUtils.e(GsonUtils.ser(dataJson));
}
@Override
public void getDataFail(String message) {
LogUtils.e(message);
}
}
源码地址
最后,感谢大家的阅读,此文只是初版,语言能力一般,模板我也尽力了,有些说的不对的地方还请多多包涵,源码后续会更新出来,如果有什么疑问或者建议,欢迎评论区留言
|