• retrofit2+rxjava+okhttp网络请求实现


    第一步:添加依赖:

        compile 'io.reactivex:rxandroid:1.2.0'
        compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
        compile 'com.squareup.retrofit2:converter-gson:2.1.0'
        compile 'com.squareup.retrofit2:retrofit:2.1.0'

    第二步:创建HttpManager

    import android.os.Build;
    import okhttp3.Cache;
    
    import com.loaderman.samplecollect.constants.HttpUrlConstants;
    import com.loaderman.samplecollect.utils.UiUtil;
    
    import java.io.File;
    import java.io.IOException;
    
    import okhttp3.Interceptor;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import retrofit2.Retrofit;
    import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
    import retrofit2.converter.gson.GsonConverterFactory;
    import okhttp3.Response;
    /**
     * Created by Administrator on 2018/10/10 0010.
     */
    
    public class HttpManager {
        private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                int maxAge = 60 * 5; // 在线缓存在5分钟内可读取
                Request request = chain
                        .request()
                        .newBuilder()
                        .addHeader("User-Agent", Build.BRAND + "/" + Build.MODEL + "/" + Build.VERSION.RELEASE)//添加请求头
                        .header("Cache-Control", "public, max-age=" + maxAge)
                        .build();
                return chain.proceed(request);
            }
        };
    
        private static File httpCacheDirectory = new File(UiUtil.getContext().getCacheDir(), "mCache");
        private static int          cacheSize          = 10 * 1024 * 1024; // 10 MiB
        private static Cache cache              = new Cache(httpCacheDirectory, cacheSize);
        private static OkHttpClient client             = new OkHttpClient.Builder()
                .addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
                .addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
                .cache(cache)
                .build();
        private static HttpManager apiManager;
        public static HttpManager getInstence() {
    
            if (apiManager == null) {
                synchronized (HttpManager.class) {
                    if (apiManager == null) {
                        apiManager = new HttpManager();
                    }
                }
            }
            return apiManager;
        }
    
        private static IHttp httpService;
    
        public IHttp getHttpService() {
            if (httpService == null) {
                synchronized (new Object()) {
                    if (httpService == null) {
                        httpService = new Retrofit
                                .Builder()
                                .baseUrl(HttpUrlConstants.BASE_URL)
                                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                                .addConverterFactory(GsonConverterFactory.create())
                                .client(client)
                                .build().create(IHttp.class);
                    }
                }
            }
            return httpService;
        }
    }

    第三步;创建IHttp

    import com.loaderman.samplecollect.constants.HttpUrlConstants;
    import com.loaderman.samplecollect.model.GetDataResult;
    import com.loaderman.samplecollect.model.RequestParams;
    
    import java.util.List;
    import java.util.Map;
    
    import okhttp3.MultipartBody;
    import retrofit2.http.Body;
    import retrofit2.http.Field;
    import retrofit2.http.FieldMap;
    import retrofit2.http.FormUrlEncoded;
    import retrofit2.http.GET;
    import retrofit2.http.Headers;
    import retrofit2.http.Multipart;
    import retrofit2.http.POST;
    import retrofit2.http.Part;
    import retrofit2.http.Query;
    import rx.Observable;
    
    /**
     * Created by Administrator on 2018/10/10 0010.
     */
    
    public interface IHttp {
    
        @GET(HttpUrlConstants.data_url)
        Observable<GetDataResult> getData2(@Query("city") String city);
    
        @Headers({"Content-Type: application/json;charset=UTF-8"})
        @POST(HttpUrlConstants.data_url)
        Observable<GetDataResult> getData1(@Body RequestParams params);
    
        @FormUrlEncoded
        @POST(HttpUrlConstants.data_url)
        Observable<GetDataResult> getData3(@Field("city") String city);
    
        @FormUrlEncoded
        @POST(HttpUrlConstants.data_url)
        Observable<GetDataResult> getData4(@FieldMap Map<String, String> map);
        //上传头像
        @Multipart
        @POST(HttpUrlConstants.data_url)
        Observable<GetDataResult> upLoadIcon(@Part List<MultipartBody.Part> partList);
        
    }

    第四步 :URL常量管理

    public interface HttpUrlConstants {
        String BASE_URL="http://wthrcdn.etouch.cn/";
    
        String data_url = "weather_mini";
    }

    第五步 : 代码中进行网络请求 :

    示例1:

    HttpManager
                    .getInstence()
                    .getHttpService()
                    .getData2("北京市")
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<GetDataResult>() {
                        @Override
                        public void onCompleted() {
    
                        }
    
                        @Override
                        public void onError(Throwable e) {
                            LoggerUtil.systemOut(e.toString());
                        }
    
                        @Override
                        public void onNext(GetDataResult getDataResult) {
                            LoggerUtil.systemOut(getDataResult.toString());
                            ToastUtil.showMsg(MainActivity.this, getDataResult.data.city);
                        }
                    });

    示例2 :上传头像

      MultipartBody.Builder builder = new MultipartBody.Builder()
                    .setType(MultipartBody.FORM)//表单类型
                    .addFormDataPart("token", ConfigConstants.getToken(this))
                    .addFormDataPart("uid", ConfigConstants.getUid(this))
                    .addFormDataPart("sign", ConfigConstants.SIGN)
                    ;
            RequestBody imageBody = RequestBody.create(MediaType.parse("image/png"), file);  //multipart/form-data image/png
            builder.addFormDataPart("file", file.getName(), imageBody);//file 后台接收图片流的参数名    +".png"
            List<MultipartBody.Part> parts = builder.build().parts();
    
            HttpManager
                    .getInstence()
                    .getLearnCarService()
                    .upLoadIcon(parts)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<UpLoadIconEntity>() {
                        @Override
                        public void onCompleted() {
                            
                        }
    
                        @Override
                        public void onError(Throwable e) {
                           
                        }
    
                        @Override
                        public void onNext(UpLoadIconEntity upLoadIconEntity) {
    
                           
                            hideLoading();
                        }
                    });

    到处完成网络请求步骤!!!

  • 相关阅读:
    一文带你看清HTTP所有概念
    程序员不得不了解的硬核知识大全
    看完这篇HTTP,跟面试官扯皮就没问题了
    ReentrantLock 源码分析从入门到入土
    计算机网络的核心概念
    Kafka 的这些原理你知道吗
    2019 我是怎么熬过来的?
    不懂什么是锁?看看这篇你就明白了
    机器学习——方差、协方差与皮尔逊值
    最小生成树的本质是什么?Prim算法道破天机
  • 原文地址:https://www.cnblogs.com/loaderman/p/9778228.html
Copyright © 2020-2023  润新知