RxJava+Retrofit上手

本篇讲述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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值