網絡通路架構經過了從使用最原始的asynctask建構簡單的網絡通路架構(甚至不能稱為架構),後來使用開源的android-async-http庫,再到使用google釋出的volley庫,一直不懈的尋找更好的解決方案,到現在也沒找到,不過據行業所說,retrofit算是行業比較牛逼的開源請求架構了吧,也算找 到了一些更好的方案,在這裡做些記錄,也做共享。
下面是我們常用的mvp模式的運作模型:
retrofit:square提供的開源産品,為android平台的應用提供一個類型安全的rest用戶端
https://github.com/square/retrofit
rxandroid:響應式程式設計架構rxjava針對android平台的擴充。
https://github.com/reactivex/rxandroid
https://github.com/reactivex/rxjava
dagger2:依賴注入(或叫ioc,用過spring的都知道這東東)架構,用于解耦的。
https://github.com/google/dagger/
為了書寫 友善,便于實踐,我們用下面的位址作為伺服器請求位址:http://ip.taobao.com/service/getipinfo.php?ip=21.22.11.33
接下來我們開始建立一個項目;
1、通過配置gradle配置将retrofit架構引入項目。
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
2、編寫api服務代碼
package com.micky.retrofitrxandroiddagger2.data.api;
import com.micky.retrofitrxandroiddagger2.data.api.response.getipinforesponse;
import retrofit.call;
import retrofit.http.get;
import retrofit.http.query;
import rx.observable;
public interface apiservice {
@get("service/getipinfo.php")
call<getipinforesponse> getipinfo(@query("ip") string ip);
}
3、定義接收資料的response
package com.micky.retrofitrxandroiddagger2.data.api.response;
import com.micky.retrofitrxandroiddagger2.data.api.model.ipinfo;
public class getipinforesponse extends baseresponse {
public ipinfo data;
4、請求資料并顯示
package com.micky.retrofitrxandroiddagger2;
import android.os.bundle;
import android.support.design.widget.floatingactionbutton;
import android.support.v7.app.appcompatactivity;
import android.support.v7.widget.toolbar;
import android.view.view;
import android.view.menu;
import android.view.menuitem;
import android.widget.progressbar;
import android.widget.textview;
import android.widget.toast;
import com.micky.retrofitrxandroiddagger2.common.utils.crashhandler;
import com.micky.retrofitrxandroiddagger2.data.api.apiservice;
import retrofit.callback;
import retrofit.gsonconverterfactory;
import retrofit.response;
import retrofit.retrofit;
import retrofit.rxjavacalladapterfactory;
import rx.subscriber;
import rx.android.schedulers.androidschedulers;
import rx.functions.action1;
import rx.schedulers.schedulers;
public class mainactivity extends appcompatactivity {
private static final string endpoint = "http://ip.taobao.com";
private textview mtvcontent;
private progressbar mprogressbar;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
toolbar toolbar = (toolbar) findviewbyid(r.id.toolbar);
setsupportactionbar(toolbar);
mtvcontent = (textview) findviewbyid(r.id.tv_content);
mprogressbar = (progressbar) findviewbyid(r.id.progress_bar);
floatingactionbutton fab = (floatingactionbutton) findviewbyid(r.id.fab);
fab.setonclicklistener(new view.onclicklistener() {
@override
public void onclick(view view) {
retrofit retrofit = new retrofit.builder()
.baseurl(endpoint)
.addconverterfactory(gsonconverterfactory.create())
.build();
apiservice apiservice = retrofit.create(apiservice.class);
mprogressbar.setvisibility(view.visible);
call<getipinforesponse> call = apiservice.getipinfo("63.223.108.42");
call.enqueue(new callback<getipinforesponse>() {
@override
public void onresponse(response<getipinforesponse> response, retrofit retrofit) {
mprogressbar.setvisibility(view.gone);
getipinforesponse getipinforesponse = response.body();
mtvcontent.settext(getipinforesponse.data.country);
}
public void onfailure(throwable t) {
mtvcontent.settext(t.getmessage());
});
}
});
}
public boolean oncreateoptionsmenu(menu menu) {
getmenuinflater().inflate(r.menu.menu_main, menu);
return true;
public boolean onoptionsitemselected(menuitem item) {
int id = item.getitemid();
if (id == r.id.action_settings) {
return true;
}
return super.onoptionsitemselected(item);