原文鏈接:http://www.itdecent.cn/p/26f1a3e8ffc2

- 如上圖,一個(gè)網(wǎng)絡(luò)請(qǐng)求就完成了,個(gè)人感覺還是挺簡單的。
目前來說小編只知道Dagger2的簡單基本用法,說說怎么實(shí)現(xiàn)上面的簡單操作網(wǎng)絡(luò)請(qǐng)求吧。
1.引入Dagger2和其注釋包
//依賴注入框架
implementation 'com.google.dagger:dagger:2.17'
annotationProcessor "com.google.dagger:dagger-compiler:2.17"
2.網(wǎng)絡(luò)模塊單例,注入器,數(shù)據(jù)提供者的建立
- a.網(wǎng)絡(luò)模塊:這里我們只是創(chuàng)建了一個(gè)單例的
LoginApi接口
@Module
public class NetWorkMoudle {
@Singleton
@Provides
public LoginApi providerLoginApi(){
return RetrofitHttp.create(LoginApi.class);
}
}
這里的RetrofitHttp可以參考:SmallOkHttp的RetrofitHttp,每個(gè)人習(xí)慣不同,你也可以使用自己封裝的Retrofit
public interface LoginApi {
@FormUrlEncoded
@POST("請(qǐng)求的具體子地址")
Observable<BaseResponse> sendSms(@Field("Phone")String phone);
}
- b.注入器:把
NetWorkMoudle網(wǎng)絡(luò)模塊添加到公共注入器中,并注入到我們的基類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 數(shù)據(jù)提供者:
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主要是對(duì)Retrofit2的回調(diào)結(jié)果進(jìn)行了處理,一是讓其請(qǐng)求在io線程,回調(diào)結(jié)果在Android主線程,方便我們處理數(shù)據(jù),二是對(duì)異常進(jìn)行了統(tǒng)一管理,每個(gè)人的包裝方式不一樣。也可以參考SmallOkHttp的RetrofitComposeUtils工具類
3.把數(shù)據(jù)提供者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中又注入了網(wǎng)絡(luò)接口實(shí)現(xiàn)LoginImpl,相當(dāng)于DataProvider又持有了LoginImpl,從而就可以通過dataProvider.login來調(diào)用dataProvider.login中的具體方法啦,就可以實(shí)現(xiàn)如頂部圖片中的一樣的操作。
當(dāng)然我們還對(duì)回調(diào)數(shù)據(jù)進(jìn)行了統(tǒng)一處理OnSuccessAndFailListener,因?yàn)槲覀冎魂P(guān)心成功的數(shù)據(jù)。OnSuccessAndFailListener可以參考:自定義Retrofit網(wǎng)絡(luò)回調(diào)結(jié)果
使用了:dagger+retrofit
看了30秒上手新一代Http請(qǐng)求神器RxHttp,我覺得每次都寫.get("http://..."),. asString()這些,我覺得還是先寫接口和實(shí)現(xiàn),最后把實(shí)現(xiàn)的方法點(diǎn)出來,更容易理解。
RxHttp.get("http://...") //第一步,確定請(qǐng)求類型,這里為Get請(qǐng)求
.asString() //第二步,確定返回類型,這里返回String類型
.subscribe(s -> { //第三步,訂閱觀察者,第二步返回Observable對(duì)象
//請(qǐng)求成功
}, throwable -> {
//請(qǐng)求失敗
});
當(dāng)然,每個(gè)人習(xí)慣不同,他的方式可以不用寫接口和實(shí)現(xiàn),而且Activity/Fragment銷毀 自動(dòng)關(guān)閉未完成的請(qǐng)求。非常值得學(xué)習(xí)!
自己寫的才是自己的,別人寫的永遠(yuǎn)是工具。