前幾天離職了,讓人失望且辱罵員工的老板,要求還那么多,爺我走了。
總算有時間來充實自己了,今天想了想,還是熟悉一下retrofit吧,其實對于它的內部源碼,現在我暫時也沒興趣去了解,先給它來個封裝吧,方便以后自己集成。
傳送門 https://github.com/Ccapton/RxRetrofit
核心代碼:基類 BaseApi.java
import com.capton.rxretrofit.listener.HttpOnNextListener;
import com.capton.rxretrofit.retrofit.RetrofitUtil;
import retrofit2.Retrofit;
import rx.Observable;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Created by capton on 2017/11/29.
*/
public class BaseApi {
private Retrofit retrofit; // retrofit 對象
protected String baseUrl = ""; // 服務器根地址
private String method= ""; // 方法標志,用于在獲取數據后的回調里區分不同的api
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getBaseUrl() {
return baseUrl;
}
/*
* 設置服務器根地址
*/
public void setBaseUrl(String baseUrl) {
this.baseUrl = baseUrl;
}
public HttpOnNextListener onNextListener; // 數據監聽器
public BaseApi(HttpOnNextListener onNextListener) {
this.onNextListener = onNextListener;
}
/*
* 獲取retrofit對象
*/
public Retrofit getRetrofit(){
this.retrofit = RetrofitUtil.getRetrofit(baseUrl);
return this.retrofit;
}
/*
* 開始進行網絡請求
*/
public void doHttpDeal(Observable<String> observable){
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onNext(String value) {
if(onNextListener!=null)
onNextListener.onNext(value,method);
}
@Override
public void onError(Throwable e) {
if(onNextListener!=null)
onNextListener.onError(e);
}
});
}
}
代碼結構
很簡陋??
1. 用我這個封裝庫如何編寫Api? 請參考下面的NewsApi.java
· NewsApi.java要繼承BaseApi.java
· 在NewsApi里要新建一個獨立的接口,里面的抽象方法返回值為Observable<String> ,方法內的參數配置具體請參考retrofit2官方文檔。
· baseUrl 根據業務需求來設置。有時候需要多個服務器地址,所以我這塊沒有把它封裝死,可以在新建子類api的時候分別設置不同的服務器根地址。
import android.content.Context;
import com.capton.rxretrofit.R;
import com.capton.rxretrofit.api.BaseApi;
import com.capton.rxretrofit.listener.HttpOnNextListener;
import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;
/**
*
* 這個接口用的是我的極速數據新聞api,演示api。
* 如果到時請求不到數據了,應該是被前面的人把剩余的請求數消耗完了,請自行找接口測試吧
*
* Created by capton on 2017/11/29.
*/
public class NewsApi extends BaseApi {
private NewsServer server;
private String appkey;
public final static String GET_NEWS = "get_news"; // 請求方法 ,每個接口類請自由定義(拿到數據后,在回調里的辨別是哪個api的哪個請求)
/**
* 演示api,獲取新聞數據
* @param context 這里的context是為了獲取系統資源,如果不需要context,則你新建BaseApi子類時可以不傳context.
* @param onNextListener 監聽回調
*/
public NewsApi(Context context, HttpOnNextListener onNextListener) {
super(onNextListener);
appkey = context.getResources().getString(R.string.jisu_news_appkey); // appkey 不是必須項
setBaseUrl("http://api.jisuapi.com/news/"); // 1. 設置baseUrl
server = getRetrofit().create(NewsServer.class); // 2. 獲取Server實例
}
public void getNews(String channel,int start,int num){
setMethod(GET_NEWS); // 3. 設置方法
doHttpDeal(server.getNews(channel,start,num,appkey)); // 4. 開始請求
}
private interface NewsServer{
/**
* 以包裹 String 類型的Observable<String>類型返回,則可以自由地選擇解析框架、
* 很直接地可以看到請求到的數據本體
* @param channel
* @param start
* @param num
* @param appkey
* @return
*/
// channel=頭條&start=0&num=10&appkey=yourappkey
@GET("get")
Observable<String> getNews(@Query("channel") String channel, @Query("start") int start,
@Query("num") int num, @Query("appkey") String appkey);
}
}
2. 在Activity或Fragment中新建API對象并調用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.getData).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getData();
}
});
}
private void getData(){
// 新建NewsApi對象
NewsApi newsApi =new NewsApi(this, new HttpOnNextListener() {
@Override
public void onNext(String data, String method) {
((TextView)findViewById(R.id.showNews)).setText(data);
// 自定義解析的方案
if(method.equals(NewsApi.GET_NEWS)){
NewsBean newsBean = (NewsBean) JsonUtil.strToObject(data,NewsBean.class);
if("0".equals(newsBean.getStatus())){
}
}
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
});
newsApi.getNews("科技",0,10);
}
好吧,這個封裝庫就簡單介紹到這,感興趣的朋友就來我的github瞧瞧
https://github.com/Ccapton/RxRetrofit