1、建立網絡請求傳回結果執行個體(根據自己的實際需要)
public class HttpResult<T> {
private int code;
private String message;
private T result;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
}
2、建立網絡請求工具類
public class HttpRequestUtils {
public static final String BASE_URL = "你網絡請求位址字首";
private static final int DEFAULT_TIMEOUT = ;
private Retrofit retrofit;
private RequestService requestService;
/**
* 建立私有構造方法,避免被外部執行個體化
*/
private HttpRequestUtils() {
//手動建立一個OkHttpClient并設定逾時時間
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
retrofit = new Retrofit.Builder()
.client(builder.build())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl(BASE_URL)
.build();
requestService = retrofit.create(RequestService.class);//網絡請求API
}
/**
* 在通路HttpRequestUtils時建立單例對象
*/
private static class SingletonHolder {
private static final HttpRequestUtils INSTANCE = new HttpRequestUtils();
}
/**
* 擷取單利對象
* @return
*/
public static HttpRequestUtils getInstance() {
return SingletonHolder.INSTANCE;
}
/**
* 擷取請求對象
* @return
*/
public static RequestService getRequestService(){
return getInstance().requestService;
}
/**
* 設定觀察者
* @param o 被觀察者
* @param s 觀察者
* @param <T> 資料類型
*/
public <T> void toSubscribe(Observable<T> o, Subscriber<T> s) {
o.subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()) //在io線程中處理網絡請求
.observeOn(AndroidSchedulers.mainThread()).subscribe(s);//在主線程中處理資料
}
}
3、處理請求結果
public class HttpResultFunction<T> implements Func1<HttpResult<T>, T> {
@Override
public T call(HttpResult<T> tHttpResult) {
if (tHttpResult.getCode() == ) {
throw new ApiException(ApiException.EXCEPTION_CODE1);//
}
return tHttpResult.getResult();
}
}
4、異常定義
public class ApiException extends RuntimeException {
public static final int EXCEPTION_CODE1= ;
public static final int EXCEPTION_CODE2= ;
public ApiException(int resultCode) {
this(getApiExceptionMessage(resultCode));
}
public ApiException(String detailMessage) {
super(detailMessage);
}
private static String getApiExceptionMessage(int code){
String message = "";
switch (code) {
case EXCEPTION_CODE1:
message = "異常1";
break;
case EXCEPTION_CODE2:
message = "異常2";
break;
default:
message = "網絡連接配接失敗";
}
return message;
}
}
5、定義請求API
public interface RequestService<T> {
@POST("user/loginApi")
Observable<HttpResult<T>> loginApi(@Field("username") String username, @Field("password") String password, @Field("pushid") String pushid);
}
6、使用調用該登陸方法
public void login( String username, String password,String pushid) {
Observable observable = HttpRequestUtils.getRequestService().loginApi(username, password,pushid).map(new HttpResultFunction<String>());
HttpRequestUtils.getInstance().toSubscribe(observable, new Subscriber<String>() {
@Override
public void onCompleted() {
Toast.makeText(OtherActivity.this,"完成",Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable throwable) {
Toast.makeText(OtherActivity.this,throwable.getMessage(),Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(String s) {
Toast.makeText(OtherActivity.this,s,Toast.LENGTH_SHORT).show();
}
});
}