如今android最為流行的網絡請求框架莫過于retrofit+rxjava,網上也是誕生了大量mvp+retrofit+rxjava的相關技術文章,但他們的要么太過于復雜要么針對性太強,讓很多人用到一半就放棄了,本人也是初學者,參考了很多技術牛人寫的例子,大家一起交流學習,下面是一個模擬獲取新聞數據的例子,不多bb。
項目結構圖

dagger2的包和mvp的包
RequestObservable類中單例接口容器和自定義okhttp
/** * 自定義okhttpclient */ PRivate static OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .build();// .addInterceptor(interceptor)// .cache(cache).build(); public static Converter.Factory gsonConverterFactory = GsonConverterFactory.create(); public static CallAdapter.Factory rxJavaCallAdapterFactory = RxJavaCallAdapterFactory.create(); /** * 獲得接口的容器 注意baseUrl要以“/”結尾 * @param * @return */ public static Api getApi() { if (retrofit == null) { synchronized (Retrofit.class) { if (retrofit == null) { retrofit = new Retrofit.Builder() .client(okHttpClient) .baseUrl("http://apis.guokr.com/handpick/") .addConverterFactory(gsonConverterFactory) .addCallAdapterFactory(rxJavaCallAdapterFactory) .build(); } } } api = retrofit.create(Api.class); return api; }統一請求地址存放的接口public interface Api { //http://apis.guokr.com/handpick/article.json?retrieve_type=by_since&category=all&limit=3&ad=1 @GET("article.json") Observable<NewsEntity> getNewsData(@QueryMap Map<String, String> map);}網絡請求的公共方法,自己做了接口回調,retrofit+rxjava的回調用著很不習慣:
package com.dianzhi.bookdemo.http;import rx.Observable;import rx.Observer;import rx.Subscription;import rx.android.schedulers.AndroidSchedulers;import rx.schedulers.Schedulers;/** * Created by CK on 2017/2/17. */public class Network { /** * get請求 * * @param observable * @param backListener */ public static Subscription get(Observable observable, CallBackListener backListener) { return observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(getObserve(backListener)); } /** * 構造observer * * @param backListener * @return */ private static Observer getObserve(final CallBackListener backListener) { Observer observer = new Observer() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { if (backListener != null) { backListener.onError(e.getMessage()); backListener.onFinish(); } } @Override public void onNext(Object o) { if (backListener != null) { backListener.onSuccess(o); backListener.onFinish(); } } }; return observer; }}mvp的代碼就不貼了,到時放出地址,再來看看dagger2的簡單運用,代碼里注釋非常詳細@Component(modules = NewsModule.class)public interface NewsCompoent { //定義注入的目標"地點" void inject(MainActivity activity);}Module層的代碼,這層就是提供類對象方法的容器@Modulepublic class NewsModule { private NewsContract.View view; public NewsModule(NewsContract.View view) { this.view = view; } @Provides NewsContract.View provide() { return this.view; }//前面提到MainActivity需要一個NewsPresenter的對象,dagger2會先在NewsModule里找有沒有一個可以提供NewsPresenter對象的方法,// 結果是NewsContract.Presenter并不是,這個是他的契約父類(注意參數和返回值不能一樣不然會進入死循環,自己找自己引起),方法返回//了參數傳過來的NewsPresenter對象,直接去找NewsPresenter的構造方法 @Provides NewsContract.Presenter provideNewsPresenter(NewsPresenter newsPresenter) { return newsPresenter; }}如果對dagger2不適合很了解可以看下這邊文章最簡單的Dagger2入門教學最后是整個地址mvp+retrofit+rxjava+dagger2
新聞熱點
疑難解答