RxJava+Retrofit上手

来源:互联网 发布:徐金华seo 编辑:程序博客网 时间:2024/06/08 06:35

本篇讲述RxJava+retrofit相结合的案例应用。
关于retrofit的介绍参见我的前一篇文章:Retrofit用法(一)快速入门,本篇介绍的是结合RxJava之后的写法与应用演示。

如果你对RxJava还不太了解,没关系,看完本篇文章的demo再去看大神们的详细介绍,理解效果更佳。

最近几天专注学习了下Rxjava与retrofit的几篇文章,刚开始确实有点懵逼,不过随着案例的介入,思路也
逐渐清晰了起来,这里做下笔记,力求用最简单的案例最少的代码说明问题。

还是简单说明下Rxjava,可以理解为就是一种异步机制,类似handler,AsyncTask ,不过远比后两者强大的多,异步操作很重要的一点就是程序的简洁性,而面对复杂的任务调度,安卓的异步机制会使代码既难写又难懂,而Rxjava的优势在于,随着代码逻辑的越来越复杂,它依然能保持简洁。
其内部原理是基于一种拓展的观察者模式来实现的。
我们熟知的普通的观察者模式有Button的onclickListener:
这里写图片描述

对于RxJava是这样的:在Rxjava里有这样几个概念:订阅subscribe(),观察者observer,被观察者obervable,以及触发的事件。道理很简单,就像EventBus的使用。不过对于Rxjava,onNext()执行完后才会执行onComplete(),这是对于正常事件流程而言,如果onNext()执行过程出现异常,会走onError,而不会执行onComplete()方法了。
这里写图片描述
好了,原理性的东西就介绍这么多,下面从实例代码来学习具体的用法。
1.添加项目依赖

 compile 'com.squareup.okhttp3:okhttp:3.2.0'    compile 'com.squareup.retrofit2:retrofit:2.0.0'    compile 'com.squareup.retrofit2:converter-gson:2.0.0'    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'    compile 'com.github.bumptech.glide:glide:3.7.0'    compile 'com.jakewharton:butterknife:7.0.1'    compile 'io.reactivex:rxjava:1.1.0'    compile 'io.reactivex:rxandroid:1.1.0'    compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'

2.写请求服务接口类SampleApi.java

package com.practice.dev.rxjavasample.network.api;import com.practice.dev.rxjavasample.model.SampleBean;import java.util.List;import retrofit2.http.GET;import retrofit2.http.Query;import rx.Observable;/** * Created by HY on 2017/4/13. */public interface SampleApi {    @GET("search")    Observable<List<SampleBean>> search(@Query("q") String query);}

3.请求方法写到一个NetWork.java文件中。

package com.practice.dev.rxjavasample.network;import com.practice.dev.rxjavasample.network.api.SampleApi;import okhttp3.OkHttpClient;import retrofit2.CallAdapter;import retrofit2.Converter;import retrofit2.Retrofit;import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;import retrofit2.converter.gson.GsonConverterFactory;/** * Created by HY on 2017/4/13. */public class NetWork {    private static SampleApi sampleApi;    private static OkHttpClient okHttpClient = new OkHttpClient();    private static Converter.Factory gsonConverterFactory = GsonConverterFactory.create();    private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJavaCallAdapterFactory.create();    public static SampleApi getZhuangbiApi() {        if (sampleApi == null) {            Retrofit retrofit = new Retrofit.Builder()                    .client(okHttpClient)                    .baseUrl("http://www.zhuangbi.info/")                    .addConverterFactory(gsonConverterFactory)                    .addCallAdapterFactory(rxJavaCallAdapterFactory)                    .build();            sampleApi = retrofit.create(SampleApi.class);        }        return sampleApi;    }}

4.返回结果的bean类:

package com.practice.dev.rxjavasample.model;/** * Created by HY on 2017/4/13. */public class SampleBean {    public String description;    public String image_url;}

5.最后是MainActivity的代码:

package com.practice.dev.rxjavasample;import android.net.Network;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ListView;import com.practice.dev.rxjavasample.model.SampleBean;import com.practice.dev.rxjavasample.network.NetWork;import java.util.List;import butterknife.Bind;import butterknife.ButterKnife;import rx.Observer;import rx.Subscription;import rx.android.schedulers.AndroidSchedulers;import rx.schedulers.Schedulers;public class MainActivity extends BaseActivity implements View.OnClickListener {    @Bind(R.id.piclist)    ListView piclist;    @Bind(R.id.search)    Button search;    private Subscription subscription;    private ListAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.bind(this);        search.setOnClickListener(this);        adapter = new ListAdapter(this);        piclist.setAdapter(adapter);    }    @Override    public void onClick(View v) {        switch (v.getId()){            case R.id.search:                show("可爱");                break;        }    }    private void show(String key) {        unsubscribe();        adapter.setImage(null);        subscription = NetWork.getZhuangbiApi()                .search(key)                .subscribeOn(Schedulers.io())//执行网络操作的线程                .observeOn(AndroidSchedulers.mainThread())//执行更新UI的线程                .subscribe(new Observer<List<SampleBean>>() {                    @Override                    public void onCompleted() {                    }                    @Override                    public void onError(Throwable e) {                    }                    @Override                    public void onNext(List<SampleBean> sampleBean) {                        adapter.setImage(sampleBean);                    }                });    }}

好啦,完整demo在这里下载:https://github.com/hiliving/RxJavaSample

0 0
原创粉丝点击