适合初学者的Retrofit+okhttp+rxjava

适合初学者的Retrofit+okhttp+rxjava

  • 转载请注明出处 http://blog.csdn.net/FlyingRookie/article/details/78248010
    本篇博客是lz在自己的理解基础上结合了其他博客的结果,如果在解释或者理论上有误差或者不同的见解可以联系博主。

废话不多说下面我们进入主题。

Retrofit初识

说起Retrofit的话,我们可以借鉴Retrofit官方描述的一句话:“A type-safe HTTP client for Android and Java”。一个针对Android和Java类型安全的http客户端。下面是retrofit的学习链接:

官网地址:retrofit
github地址:retrofit
学习retrofit我们需要知道retrofit是做什么,怎么做。

Retrofit做什么?

对于Retrofit通俗的来讲就是一个用于Android和java的网络库,使用retrofit可以简化我们的网络操作,提高效率和正确率。它是Square公司开源的一个高质量高效率的http库,通过retrofit进行get、post等操作就只需要一行代码或者一个注解就可以搞定。

Retrofit怎么做?

对于所有的网络通信,不管是volley还是okhttp,他的核心的任务就是:客户端与服务端进行数据的交互和操作。既然要进行数据的交互和操作,那么我们学习需要关注的点就出来了:

  • 如何配置retrofit
  • 如何传入URL以及参数变量
  • 如何获取服务器返回的json数据,如何封装成对应的类或者接口
  • 如何进行get、post、pull等操作

Retrofit的基本用法可以去阅读Retrofit基本用法和流程分析这里不做详解。

什么是Rxjava

RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。概括的很精准但是具体是什么意思呢,其实说白了rajava可以归纳为异步,就是一个完成异步操作的库。这里就简单的说一下rxjava的概念,具体的了解大家可以参考两篇我认为写的比较好的博客来看:

抛物线大神的(主要对rxjava进行入门解读):
给 Android 开发者的 RxJava 详解
针对rxjava的观察者模式的详解:
给初学者的RxJava2.0教程
okhttp这里就不做过多的阐述了,下面我们来看具体的封装实现:

实现Retrofit+okhttp+rxjava的封装

  1. 添加依赖文件
    在Gradle中添加如下依赖:
    compile 'io.reactivex:rxjava:1.1.10'
    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'com.google.code.gson:gson:2.4'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    compile 'com.squareup.okhttp3:okhttp:3.4.1'
    compile 'com.squareup.okio:okio:1.10.0'
  1. 本地网络访问的客户端的封装
    这里采取了单例模式封装retrofit客户端,调用聚合数据的机器人接口:
    接口地址http://op.juhe.cn/robot/index
    参数: info=”“&key=”“&userid=”“
public class LocalCilent {

    private static String BASE_URL = "http://op.juhe.cn/robot/";
    private static Retrofit retrofit = null;
    private static OkHttpClient okHttpClient = null;
    private static LocalCilent localCilent = null;
    private LocalCilent() {
//        retrofit = getRetrofit();
    }

    public static LocalCilent getInstance(){
        if (localCilent == null){
            synchronized (LocalCilent.class){
                if (localCilent ==null){
                    localCilent = new LocalCilent();
                }
            }
        }
        return localCilent;
    }
    /**
     * 重新设置baseUrl
     * @param baseUrl 需要在调用create之前调用
     * @return 当前对象
     */
    public static LocalCilent setBaseUrl(String baseUrl) {
        BASE_URL = baseUrl;
        return localCilent;
    }
    //创建服务接口,不绑定生命周期
    public  T create(Class cla){
        retrofit = getRetrofit();
        return retrofit.create(cla);
    }

    //设置okhttpclient
    private static OkHttpClient initOkHttpClient(){
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();//拦截器
        interceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);//拦截头部信息
        OkHttpClient httpClient = new OkHttpClient.Builder()
                .addNetworkInterceptor(interceptor)//设置头部拦截器
                .retryOnConnectionFailure(true)
                .readTimeout(Config.READ_TIMEOUT, TimeUnit.SECONDS)
                .writeTimeout(Config.WRITE_TIMEOUT,TimeUnit.SECONDS)
                .connectTimeout(Config.CONNECT_TIMEOUT,TimeUnit.SECONDS)
                .addInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        Request request = chain.request()//获取请求
                                .newBuilder()
                                .addHeader("source-terminal", "Android")   //操作系统名称(注:ios、android)//设备型号
                                .addHeader("device-model", Build.MODEL)         //设备型号
                                .addHeader("os-version", Build.VERSION.RELEASE)//操作系统版本号
                                .build();
                        Log.d("request",request.toString());
                        return chain.proceed(request);
                    }
                }).build();
        return httpClient;
    }
    //设置Retrofit,不带生命周期绑定的
    protected static Retrofit getRetrofit(){
        if (retrofit == null){
            if (okHttpClient == null){
                okHttpClient = initOkHttpClient();
            }
            retrofit = new Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())//json转换器支持
                        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                        .client(okHttpClient)
                        .build();
        }
        return retrofit;
    }
    /**
     * 提供方法单独获取okhttpCilent
     * @return okhttpCilent
     */
    public OkHttpClient getOkHttpCilent(){
        if(okHttpClient == null){
            okHttpClient = initOkHttpClient();
        }
        return okHttpClient;
    }
}
  1. 创建接口api进行网络请求
    这里演示get请求获取
public interface ChatApi {


    @GET("index")
    Observable getchat(@Query("info") String info,@Query("key") String key,@Query("userid") String userid);

}
  1. 创建present实现类
public class ChatPresenterImpl implements ChatPresenter {
    private IChatView chatView;


    public ChatPresenterImpl(IChatView chatView) {
        this.chatView = chatView;
    }

    public void sendInfo(){
        chatView.showDialog();
         LocalCilent.getInstance()
                .create(ChatApi.class)//创建请求
                .getchat(chatView.getInfo(), Config.KEY, "1001")//请求参数
                .subscribeOn(Schedulers.io())//指定被观察者的操作在io线程中完成
                .observeOn(AndroidSchedulers.mainThread())// // 指定观察者接收到数据,然后在Main线程中完成
                .subscribe(new Subscriber() {
                    @Override
                    public void onCompleted() {
                        Log.d("Info", "onCompleted: ");
                        chatView.hindDialog();
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d("Info", "onError: " + e.getMessage());
                        chatView.hindDialog();
                    }

                    @Override
                    public void onNext(ChatBean chatBean) {
                        Log.d("Info", "onNext: " + chatBean.toString());
                        chatView.hindDialog();
                        chatView.clear();
                    }
                });

    }
}
  1. *Activity中调用
    这里采用的是mvp架构的思想
    public class ChatActivity extends BaseActivity implements View.OnClickListener,IChatView {


    private EditText editTextInfo;
    private TextView send;
    //界面功能的具体实现(耗时操作)------网络请求
    private ChatPresenter chatPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);
    }

    /**
     * 界面初始化操作
     */
    @Override
    public void initView() {
        //自定义的findview来获取Id
        editTextInfo = findView(R.id.info);
        send = findView(R.id.send);
        send.setOnClickListener(this);
    }

    /**
     * 数据初始化操作
     */
    @Override
    public void initData() {
        chatPresenter = new ChatPresenterImpl(this);
//            showToast(NdkHelper.GetStringFromC());
    }

    /**
     * 防止快速点击事件
     * 这里没有使用,这是baseactivity里面封装的功能
     * @param v
     */
    @Override
    public void widgetClick(View v) {

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.send:
                    chatPresenter.sendInfo();
                break;
        }
    }
    @Override
    public void showDialog() {
        loadingDialog.Dialogshow();
    }
    @Override
    public void hindDialog() {
        loadingDialog.DialogCancle();
    }
    @Override
    public String getInfo() {
        return editTextInfo.getText().toString();
    }
    @Override
    public void flush() {
    }
    @Override
    public void clear() {
        editTextInfo.setText("");
    }

    @Override
    public Activity getActivity() {
        return this;
    }

}

如果有什么不明白的或者文章中出现的问题可以随时留言给我欢迎指出。
转载请注明出处:http://blog.csdn.net/FlyingRookie/article/details/78248010
谢谢

你可能感兴趣的:(Android)