Retrofit+RxJava網絡請求

BaseApis

package com.zjh.administrat.torchbearer_power.bag.utilsbag;

import java.util.Map;

import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PartMap;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;

public interface BaseApi<T> {
   /* @Headers({
            "Accept: application/vnd.yourapi.v1.full+json",
            "User-Agent: Apps"
    })*/
    @GET
    rx.Observable<ResponseBody> get( @Url String urlStr);

    @POST
    rx.Observable<ResponseBody> post(@Url String urlStr, @QueryMap Map<String, String> map);

    @Multipart
    @POST
    rx.Observable<ResponseBody> postFormBody(@Url String urlStr, @PartMap Map<String, RequestBody> requestBodyMap);

}

RetrofitManager

package com.zjh.administrat.torchbearer_power.bag.utilsbag;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

import static com.zjh.administrat.torchbearer_power.bag.utilsbag.Apis.BASE_UEL;

public class RetrofitManager {
    /***
     * 使用單例
     */
    private static volatile RetrofitManager retrofitManager;
    public static RetrofitManager getInstance(){
        if (retrofitManager == null){
            synchronized (RetrofitManager.class){
                retrofitManager = new RetrofitManager();
            }
        }
        return retrofitManager;
    }

    private BaseApi baseApi;

    /***
     * 日誌攔截器,超時處理
     */
    public RetrofitManager(){
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(15, TimeUnit.SECONDS);
        builder.readTimeout(15, TimeUnit.SECONDS);
        builder.writeTimeout(15, TimeUnit.SECONDS);
        builder.addInterceptor(interceptor);
        builder.retryOnConnectionFailure(true);
        OkHttpClient client = builder.build();

        Retrofit retrofit = new Retrofit.Builder()
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .baseUrl(BASE_UEL)
                .client(client)
                .build();
        baseApi = retrofit.create(BaseApi.class);

    }
    /***
     * 處理map集合的類型
     */
    public Map<String, RequestBody> generatrRequestBody(Map<String, String> requestDataMap){
        Map<String, RequestBody> requestBodyMap = new HashMap<>();
        for (String key : requestDataMap.keySet()) {
            RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"),
                    requestDataMap.get(key) == null ? "" : requestDataMap.get(key));
            requestBodyMap.put(key, requestBody);
        }
        return requestBodyMap;
    }


    /**
     * get請求
     */
    public RetrofitManager get(String url) {

        baseApi.get(url)
                //後臺執行在哪個線程中
                .subscribeOn(Schedulers.io())
                //最終完成後執行在哪個線程
                .observeOn(AndroidSchedulers.mainThread())
                //設置我們的rxJava
                .subscribe(observer);

        return retrofitManager;
    }

    /**
     * 表單post請求
     */
    public RetrofitManager postFormBody(String url, Map<String, RequestBody> map) {
        if (map == null) {
            map = new HashMap<>();
        }

        baseApi.postFormBody(url, map)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);
        return retrofitManager;
    }

    /**
     * 普通post請求
     */
    public RetrofitManager post(String url, Map<String, String> map) {
        if (map == null) {
            map = new HashMap<>();
        }
        baseApi.post(url, map)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);
        return retrofitManager;
    }

    private rx.Observer observer = new rx.Observer<ResponseBody>() {
        @Override
        public void onNext(ResponseBody responseBody) {
            try {
                String string = responseBody.string();
                if (mListener != null){
                    mListener.onSuccess(string);
                }
            } catch (IOException e) {
                e.printStackTrace();
                if (mListener != null){
                    mListener.onFail(e.getMessage());
                }
            }
        }

        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {
            if (mListener != null) {
                mListener.onFail(e.getMessage());
            }
        }

    };
    /***
     * 成員變量
     */
    private HttpListener mListener;
    /***
     * set方法
     */
    public void result(HttpListener listener) {
        this.mListener = listener;
    }
    /***
     * 定義接口
     */
    public interface HttpListener {
        void onSuccess(String data);
        void onFail(String error);
    }

}

IModelImpl

package com.zjh.administrat.torchbearer_power.bag.modelbag;

import com.google.gson.Gson;
import com.zjh.administrat.torchbearer_power.bag.callbackbag.MyCallBack;
import com.zjh.administrat.torchbearer_power.bag.utilsbag.RetrofitManager;

import java.util.Map;

import okhttp3.RequestBody;

public class IModelImpl implements IModel {

   /*
   *    post請求
   * */
    @Override
    public void mrequestData(String url, Map<String, String> params, final Class clazz, final MyCallBack myCallBack) {
        //final Map<String, RequestBody> map = RetrofitManager.getInstance().generatrRequestBody(params);
        RetrofitManager.getInstance().post(url, params).result(new RetrofitManager.HttpListener() {
            @Override
            public void onSuccess(String data) {
                try{
                    Object o = new Gson().fromJson(data, clazz);
                    if(myCallBack != null){
                        myCallBack.OnSuccess(o);
                    }
                }catch (Exception e){
                    e.printStackTrace();
                    if(myCallBack != null){
                        myCallBack.OnFail(e.getMessage());
                    }
                }
            }
            @Override
            public void onFail(String error) {
                if(myCallBack != null){
                    myCallBack.OnFail(error);
                }
            }
        });
    }


    /**
     *    get請求
     * */
    @Override
    public void getRequestData(String url, final Class clazz, final MyCallBack myCallBack) {
        RetrofitManager.getInstance().get(url).result(new RetrofitManager.HttpListener() {
            @Override
            public void onSuccess(String data) {
                try{
                    Object o = new Gson().fromJson(data, clazz);
                    if(myCallBack != null){
                        myCallBack.OnSuccess(o);
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            @Override
            public void onFail(String error) {
                if(myCallBack != null){
                    myCallBack.OnFail(error);
                }
            }
        });
    }

    /**
     *
     * */

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章