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
- RxJava+Retrofit上手
- Rxjava上手
- Retrofit+Rxjava
- Retrofit+RxJava
- Retrofit+RxJava
- Retrofit+RxJava
- Retrofit+RxJava
- RxJava+Retrofit
- rxjava+retrofit
- RxJava&Retrofit
- Retrofit+Rxjava
- Retrofit+RxJava
- RXJava & Retrofit
- Rxjava+retrofit
- rxjava+retrofit
- Rxjava & Retrofit
- retrofit+Rxjava
- Retrofit + RxJava
- gradle依赖中对于版本控制的统一管理
- 百度地图
- 取数字问题
- scikit learn(sklearn)机器学习算法选择
- NYOJ586疯牛(二分查找算法)
- RxJava+Retrofit上手
- Docker的上手(Ubuntu140.4 Mate)
- 自动化测试
- LR2
- Java数组练习(三)选择排序
- springmvc 接受 map类型的参数
- 递归典型算法
- QT中显示GIF图片
- YOU NEED PYTHON writeup