原文链接:https://www.jianshu.com/p/26f1a3e8ffc2
- 如上图,一个网络请求就完成了,个人感觉还是挺简单的。
目前来说小编只知道Dagger2的简单基本用法,说说怎么实现上面的简单操作网络请求吧。
1.引入Dagger2和其注释包
//依赖注入框架
implementation 'com.google.dagger:dagger:2.17'
annotationProcessor "com.google.dagger:dagger-compiler:2.17"
2.网络模块单例,注入器,数据提供者的建立
- a.网络模块:这里我们只是创建了一个单例的
LoginApi
接口
@Module
public class NetWorkMoudle {
@Singleton
@Provides
public LoginApi providerLoginApi(){
return RetrofitHttp.create(LoginApi.class);
}
}
这里的RetrofitHttp
可以参考:SmallOkHttp的RetrofitHttp
,每个人习惯不同,你也可以使用自己封装的Retrofit
public interface LoginApi {
@FormUrlEncoded
@POST("请求的具体子地址")
Observable<BaseResponse> sendSms(@Field("Phone")String phone);
}
- b.注入器:把
NetWorkMoudle
网络模块添加到公共注入器中,并注入到我们的基类BaseFragment
和BaseActivity
中
@Singleton
@Component(modules = NetWorkMoudle.class)
public interface CommonComponent {
void inject(BaseFragment baseFragment);
void inject(BaseActivity baseActivity);
}
//在`Fragment`和`Activity`中的`onCreate`方法中注入
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DaggerCommonComponent.builder().build().inject(this);
}
- c 数据提供者:
public class DataProvider {
@Inject
public DataProvider(){}
@Inject
public LoginImpl login;
}
public class LoginImpl implements LoginApi{
@Inject
LoginApi loginApi;
@Inject
public LoginImpl() {}
public Observable<BaseResponse> sendSms(String phone) {
return bindIoUI(loginApi.sendSms(phone));
}
}
其中bindIoUI
主要是对Retrofit2的回调结果进行了处理,一是让其请求在io线程,回调结果在Android主线程,方便我们处理数据,二是对异常进行了统一管理,每个人的包装方式不一样。也可以参考SmallOkHttp的RetrofitComposeUtils
工具类
3.把数据提供者DataProvider
注入到基类BaseFragment
和BaseActivity
public class BaseActivity extends AppCompatActivity{
@Inject
protected DataProvider dataProvider;
}
public abstract class BaseFragment extends Fragment {
@Inject
protected DataProvider dataProvider;
}
4.持有说明:
这样只要是继承了我们的基类的Fragment
和Activity
都持有了DataProvider
,(上面2.a中)DataProvider
中又注入了网络接口实现LoginImpl
,相当于DataProvider
又持有了LoginImpl
,从而就可以通过dataProvider.login
来调用dataProvider.login
中的具体方法啦,就可以实现如顶部图片中的一样的操作。
当然我们还对回调数据进行了统一处理OnSuccessAndFailListener
,因为我们只关心成功的数据。OnSuccessAndFailListener
可以参考:自定义Retrofit网络回调结果
使用了:dagger+retrofit
看了30秒上手新一代Http请求神器RxHttp,我觉得每次都写.get("http://...")
,. asString()
这些,我觉得还是先写接口和实现,最后把实现的方法点出来,更容易理解。
RxHttp.get("http://...") //第一步,确定请求类型,这里为Get请求
.asString() //第二步,确定返回类型,这里返回String类型
.subscribe(s -> { //第三步,订阅观察者,第二步返回Observable对象
//请求成功
}, throwable -> {
//请求失败
});
当然,每个人习惯不同,他的方式可以不用写接口和实现,而且Activity/Fragment销毁 自动关闭未完成的请求。非常值得学习!
自己写的才是自己的,别人写的永远是工具。