版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Retrofit2.0+RxJava+Dragger2實(shí)現(xiàn)不一樣的Android網(wǎng)絡(luò)架構(gòu)搭建封裝實(shí)現(xiàn)網(wǎng)絡(luò)框架這種行為固然不錯(cuò),但是這需要自身具備比較高的能力,而很多時(shí)候我們沒有那樣的能力把它封裝的足夠好。這時(shí)我們使用開源的網(wǎng)絡(luò)框架也未嘗不是一件好事,github上面知名的網(wǎng)絡(luò)框架已經(jīng)經(jīng)過了很多app的驗(yàn)證,在一定意義上是非常符合我們?cè)趯?shí)際的項(xiàng)目開發(fā)所需要的。Android開發(fā)中幾個(gè)知名的開源的網(wǎng)絡(luò)框架有android-async-http,Volley,OkHttp等,國人 開發(fā)的xUtils快速開發(fā)框架也比較流行。android-async-http是個(gè)很老牌的網(wǎng)絡(luò)框架,非常的經(jīng)典。Voll
2、ey官方推薦的,自不必說。OkHttp可以說是后起之秀,現(xiàn)在非常流行,Android系統(tǒng)底層api都有用到,所以是非常niubility. 我們很多開發(fā)者大都在小型公司,不了解大公司是怎么做Android網(wǎng)絡(luò)框架的,也想知道那些用戶量過千萬的APP到底用了些什么技術(shù),下面有兩張圖片,讓我們一起來了解一下Android版的美團(tuán)和Uber到底用了些什么技術(shù)。 Uber看完你會(huì)發(fā)現(xiàn)其實(shí)這些用戶量過億的APP也使用了很多的開源框架,而且這些開源框架中大多數(shù)其實(shí)都是我們平常在開發(fā)中所常用到的,并不陌生??赡艽蠖鄶?shù)人對(duì)Retrofit,Rxjava這些還不太熟悉,那話不多說,今天我們就來講講怎么用Retr
3、ofit2.0+RxJava+Dragger2來實(shí)現(xiàn)Android網(wǎng)絡(luò)構(gòu)架搭建,給大家提供一種思路,供大家參考參考。RxJava是一種響應(yīng)式編程框架,采用觀察者設(shè)計(jì)模式。最核心的是Observables(被觀察者,事件源)和Subscribers(觀察者)這兩個(gè)東西,RxAndroid是Rxjava在Android上的實(shí)現(xiàn)。Dragger2 - 是一種依賴注入框架,可以大大節(jié)省我們的代碼量,便于維護(hù)。在這里我就不費(fèi)過多筆墨來介紹著三個(gè)東西了,今天的主題是提供一種如何搭建一個(gè)不一樣的網(wǎng)絡(luò)框架的思路。如果讀者對(duì)這三個(gè)框架不是很了解的話,可以自行的Google腦補(bǔ)一下。 首先,就是開始把這些框架引入
4、到咱們的項(xiàng)目中來作為依賴庫,在app/build.gradle文件中添加 apply plugin: 'com.android.application'apply plugin: 'com.neenbedankt.android-apt'android compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig applicationId "com.finddreams.retrofit" minSdkVersion 15 targetSdkVersion 2
5、3 versionCode 1 versionName "1.0"buildTypes release minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard- ' dependencies compile fileTree(include: '*.jar', dir: 'libs')testCompile 'junit:junit:4.12'comp
6、ile 'com.android.support:appcompat-v7:23.1.1'/retrofitcompile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'/gson解析compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'/rxjavacompile 'io.reactivex:rxandroid:1.1.0'compile 'com.squareup.retrofit2:adapter-rxjava
7、:2.0.0-beta4'/dragger2provided 'org.glassfish:javax.annotation:10.0-b28'apt 'com.google.dagger:dagger-compiler:2.0.2'compile 'com.google.dagger:dagger:2.0.2'因?yàn)镈ragger2是基于注解的,它會(huì)預(yù)先生成一些類文件,所以需要在整個(gè)項(xiàng)目的/build.gradle文件中加上apt工具: buildscript repositories jcenter() dependencies cla
8、sspath 'com.android.tools.build:gradle:2.0.0-beta6' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' / NOTE: Do not place your application dependencies here; they belong / in the individual module build.gradle files allprojects repositories jcenter() task clean(type: Delete
9、) delete rootProject.buildDir接著開始寫一個(gè)提供Retrofit的單例類: /* * Retrofit的實(shí)體類 */ public class RestApiAdapter private static Retrofit retrofit = null;public static Retrofit getInstance() if (retrofit = null) GsonConverterFactory gsonConverterFactory = GsonConverterFactory.create(); OkHttpClient okHttpClient
10、= new OkHttpClient(); OkHttpClient.Builder builder = okHttpClient.newBuilder(); builder.retryOnConnectionFailure(true); retrofit = new Retrofit.Builder().client(okHttpClient) .baseUrl(ConstantApi.BaiduUrl) .addConverterFactory(gsonConverterFactory) .addCallAdapterFactory(RxJavaCallAdapterFactory.cre
11、ate() .build(); return retrofit;addCallAdapterFactory(RxJavaCallAdapterFactory.create() 這個(gè)方法就是RxJava和Retrofit結(jié)合的關(guān)鍵。接著我們?yōu)镽etrofit 提供一個(gè)service接口,聲明api接口地址和所需要的參數(shù),這里我們使用百度API提供的天氣接口,實(shí)現(xiàn)根據(jù)城市名稱查詢天氣的功能,接口地址: 代碼如下: /* * 天氣接口Api */public interface WeatherApiService /* * 查詢天氣 */ GET("apistore/weatherserv
12、ice/cityname") Observable<WeatherResultBean> queryWeather(Header("apikey") String apikey, Query("cityname") String cityname);返回一個(gè)Observable被觀察者/事件源的意思是交給RxJava來處理。 然后我們寫一個(gè)BaseSubsribe觀察者來管理網(wǎng)絡(luò)請(qǐng)求開始結(jié)束,成功與失?。簆ublic abstract class BaseSubsribe<T> extends Subscriber<
13、;T> private static final String TAG = "BaseSubsribe"Overridepublic void onStart() super.onStart(); Log.i(TAG, "onStart");Overridepublic void onNext(T t) Log.i(TAG, "response" + t.toString(); onSuccess(t);Overridepublic void onCompleted() Log.i(TAG, "onCompleted&
14、quot;);public abstract void onSuccess(T result);Overridepublic void onError(Throwable e) e.printStackTrace(); Log.i(TAG, "onError" + e.getMessage();接著我們寫一個(gè)WeatherInteractor接口連接service類:public interface WeatherInteractor Subscription queryWeather(String apikey, String cityname, BaseSubsribe
15、<WeatherResultBean> subsribe);然后是這個(gè)接口的實(shí)現(xiàn)類: public class WeatherInteractorImpl implements WeatherInteractor private final WeatherApiService api; Inject public WeatherInteractorImpl(WeatherApiService myApi) this.api = myApi; Override public Subscription queryWeather(String apikey, String citynam
16、e, BaseSubsribe<WeatherResultBean> subsribe) Observable<WeatherResultBean> observable = api.queryWeather(apikey, cityname); Subscription subscribe = observable.subscribeOn(Schedulers.io().observeOn(AndroidSchedulers.mainThread().subscribe(subsribe); return subscribe; 接下來是如何使用Dragger2的時(shí)候,
17、知道Dragger2的都知道有幾個(gè)概念,一個(gè)是Module:主要提供依賴對(duì)象比如context, rest api ; 一個(gè)是inject:注解,用在需要依賴對(duì)象的地方;另一個(gè)是Componet:用來連接Module和inject 首先定義一個(gè)Module類,提供需要注入依賴的對(duì)象: Module類 Module public class InteractorModule Pvides public Retrofit provideRestAdapter() return RestApiAdapter.getInstance(); Providespublic WeatherApiServic
18、e provideHomeApi(Retrofit restAdapter) return restAdapter.create(WeatherApiService.class);Provides public WeatherInteractor provideHomeInteractor(WeatherApiService myApi) return new WeatherInteractorImpl(myApi);接著是寫一個(gè)Componet類:/* * 聲明AppComponent組件 * * author finddreams * address */SingletonComponen
19、t(modules = InteractorModule.class,)public interface AppComponent void inject(App app);WeatherInteractor getWeatherInteractor();然后我們?cè)贏pplication中初始化這個(gè)AppComponent:/* * Application類 * * author finddreams * address */public class App extends Application private AppComponent component;Overridepublic vo
20、id onCreate() super.onCreate();setDraggerConfig();public AppComponent component() return component;public static App get(Context context) return (App) context.getApplicationContext();/* * 初始化Dragger,DaggerAppComponent是自動(dòng)生成,需要Rebuild */private void setDraggerConfig() component = DaggerAppComponent.bu
21、ilder().interactorModule(new InteractorModule()ld();component.inject(this);這里需要注意的是,由于Dagger2是預(yù)編譯生成一個(gè)類,所以我們需要Rebuild項(xiàng)目,才會(huì)生成DaggerAppComponent這個(gè)類。如果開發(fā)中出現(xiàn)import com.finddreams.retrofit.api.config.DaggerAppComponent; 找不到這個(gè)類的錯(cuò)誤這時(shí)就需要重新的Rebuild項(xiàng)目 最后我們就可以在Activity中開始使用了: /* * 主頁 * * author finddreams * add
22、ress */ public class MainActivity extends AppCompatActivity private AppComponent component; private WeatherInteractor weatherInteractor; private EditText city; private TextView queryresult; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); city = (EditText) findViewById(R.id.city); queryresult = (TextView) findViewById(R.id.queryresult); /獲取到AppComponent組件 component = App.get(this).component(); /通過AppComponent拿到WeatherInteractor weatherInteracto
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025河南建筑安全員-A證考試題庫附答案
- 貴州大學(xué)《醫(yī)學(xué)統(tǒng)計(jì)學(xué)規(guī)培》2023-2024學(xué)年第一學(xué)期期末試卷
- 貴州財(cái)經(jīng)職業(yè)學(xué)院《火災(zāi)動(dòng)力學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025福建建筑安全員考試題庫
- 貴陽學(xué)院《保險(xiǎn)投資學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 硅湖職業(yè)技術(shù)學(xué)院《植物造景技術(shù)(一)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣州幼兒師范高等專科學(xué)?!稛o人機(jī)結(jié)構(gòu)與系統(tǒng)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年貴州省安全員B證考試題庫及答案
- 2025江蘇建筑安全員《B證》考試題庫及答案
- 2025年河南省安全員《C證》考試題庫及答案
- 2024-2025學(xué)年北京房山區(qū)初三(上)期末英語試卷
- 公路工程質(zhì)量與安全管理課件
- 四年級(jí)道德與法治試卷分析范文(通用5篇)
- 封條模板A4直接打印版
- 常見化療藥物的不良反應(yīng)及預(yù)防 課件
- 電解銅箔制造工藝簡介
- 15MW風(fēng)力發(fā)電機(jī)
- 正面管教 讀書分享(課堂PPT)
- 教練技術(shù)CP理論P(yáng)PT課件
- 產(chǎn)品生命周期曲線(高清)
- 機(jī)械工程學(xué)報(bào)標(biāo)準(zhǔn)格式
評(píng)論
0/150
提交評(píng)論