Dagger2+Retrofit2兩個(gè)2來進(jìn)行網(wǎng)絡(luò)請(qǐng)求

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

Dagger2+Retrofit2
  • 如上圖,一個(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可以參考:SmallOkHttpRetrofitHttp,每個(gè)人習(xí)慣不同,你也可以使用自己封裝的Retrofit

public interface LoginApi {
    @FormUrlEncoded
    @POST("請(qǐng)求的具體子地址")
    Observable<BaseResponse> sendSms(@Field("Phone")String phone);
}
  • b.注入器:把NetWorkMoudle網(wǎng)絡(luò)模塊添加到公共注入器中,并注入到我們的基類BaseFragmentBaseActivity
@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è)人的包裝方式不一樣。也可以參考SmallOkHttpRetrofitComposeUtils工具類

3.把數(shù)據(jù)提供者DataProvider注入到基類BaseFragmentBaseActivity
  public class BaseActivity extends AppCompatActivity{
    @Inject
    protected DataProvider dataProvider;
  }
  public abstract class BaseFragment extends Fragment {
    @Inject
    protected DataProvider dataProvider;
  }
4.持有說明:

這樣只要是繼承了我們的基類的FragmentActivity都持有了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)是工具。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容