GithubHelp home page GithubHelp logo

rxjavasamples's Introduction

样例代码已正式切换到基于 RxJava 2

需要旧版 RxJava 1 代码的点这里

项目介绍

RxJava 2 和 Retrofit 结合使用的几个最常见使用方式举例。

  1. 基本使用

实现最基本的网络请求和结果处理。 screenshot_1

  1. 转换(map)

把返回的数据转换成更方便处理的格式再交给 Observer。 screenshot_2

  1. 压合(zip)

将不同接口并行请求获取到的数据糅合在一起后再处理。 screenshot_3

  1. 一次性 token

需要先请求 token 再访问的接口,使用 flatMap() 将 token 的请求和实际数据的请求连贯地串起来,而不必写嵌套的 Callback 结构。 screenshot_4

  1. 非一次性 token

对于非一次性的 token (即可重复使用的 token),在获取 token 后将它保存起来反复使用,并通过 retryWhen() 实现 token 失效时的自动重新获取,将 token 获取的流程彻底透明化,简化开发流程。 screenshot_5

  1. 缓存

使用 BehaviorSubject 缓存数据。 screenshot_6

apk 下载

RxJavaSamples_2.0.apk

rxjavasamples's People

Contributors

dearzhai avatar devinfu avatar rengwuxian avatar troyliu0105 avatar viizki avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rxjavasamples's Issues

关于Subscriber.onStart()何时被调用的问题

大大你好,你写的文章上说Subscriber.onStart()总是在 subscribe所发生的线程被调用,但下面的代码并没有报错:
String baseUrl = "https://api.douban.com/v2/movie/";
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();

    ClientApi clientApi = retrofit.create(ClientApi.class);
    clientApi.getTopMovies(0, 5)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<MovieEntity>() {

                @Override
                public void onStart() {
                    progressBar.setVisibility(View.VISIBLE);
                }

                @Override
                public void onCompleted() {
                    progressBar.setVisibility(View.GONE);
                    Toast.makeText(context, "完成网络请求!", Toast.LENGTH_LONG).show();
                }

                @Override
                public void onError(Throwable e) {
                    text.setText(e.getMessage());
                }

                @Override
                public void onNext(MovieEntity movieEntity) {
                    text.setText(movieEntity.toString());
                }
            });

我使用subscribeOn设置subscribe()在IO线程,直接在onStart()方法中显示progressBar,按理说progressBar没有在主线程执行,应用会奔溃才对,但是一切正常

http://www.zhuangbi.info/ broken

I am a greenhorn of RxJava. When I studies your elegant codes, I find that the website http://www.zhuangbi.info/ has been broken, which results in several malfunctions of your demo.
In fact, I cannot do anything. Could you please update another usable website?
Thanks a billion.

关于*map的一些疑问

凯哥好,
如果我在map中接收udp的data包,相当于阻塞线程,此时就算调用了unsubscribe()最终也还是会执行Observer,这样会造成内存泄漏,遇到这样的情况该如何处理?

thanks a lot

Real a good demo as a introduction of retrofit & rxjava. Help me a lot.

Flatmap 的用法的两个问题

subscription = fakeApi.getFakeToken("fake_auth_code")
                .flatMap(new Func1<FakeToken, Observable<FakeThing>>() { 
                    @Override 
                    public Observable<FakeThing> call(FakeToken fakeToken) { 
                        return fakeApi.getFakeData(fakeToken); 
                    } 
                }) 
                .subscribeOn(Schedulers.io()) 
                .observeOn(AndroidSchedulers.mainThread()) 
                .subscribe(new Action1<FakeThing>() { 
                    @Override 
                    public void call(FakeThing fakeData) {
//1.在这里怎么获取request httpurl
//List<Cookie> cookies = Cookie.parseAll(call.request().url(), response.headers());
//2.在这里怎么fakeToken数据,我要整合fakeToken和fakeData,一起返回
                        swipeRefreshLayout.setRefreshing(false);
                        tokenTv.setText(getString(R.string.got_data, fakeData.id, fakeData.name));
                    } 
                }, new Action1<Throwable>() {
                    @Override 
                    public void call(Throwable throwable) {
                        swipeRefreshLayout.setRefreshing(false);
                        Toast.makeText(getActivity(), R.string.loading_failed, Toast.LENGTH_SHORT).show();
                    } 
                }); 
    } 

关于RxJava链式的请教

你好,想请教下Retrofit + RxJava遇到的问题。

现有一情景,网络请求顺序:请求token->请求分类->请求列表,类似这样的链式请求。在其中某个环节断网了,想停留在该环节等待有网继续往下走,如何处理?

我尝试使用retryWhen,可以等有网请求,但是整个链式请求会重新走一遍,如何在某个环节等待、有网继续往下请求,不知道如何解决?

关于Response的问题

public interface GankApi {
@get("data/福利/{number}/{page}")
Observable getBeauties(@path("number") int number, @path("page") int page);
}

接口这么定义, Observable , 请问怎么获取Response里面的元数据,如有需要的话 就没办法了吧?

rxjava2

rxjava2和rxjava1比较区别还是挺大的,能否在讲一讲rxjava2的基本使用呢

没看懂你的图片缓存

我看App是把一个List保存到本地数据库的,,Item中只有一个时间和图片的网络url.为什么断网后从数据库取出来网络url还可以进行图片展示? 一般的缓存不都是通过这个url将图片下载下来后保存本地吗,你是如何实现的?

缓存的问题

我尝试使用okhttp3自带的缓存机制为什么无法使用呢?您使用过自带的缓存机制吗?望回复

关于Data里的loadFromNetwork的疑问

Network.getGankApi()
.getBeauties(100, 1)
.subscribeOn(Schedulers.io())
.map(GankBeautyResultToItemsMapper.getInstance())
.doOnNext(new Action1<List>() {
@OverRide
public void call(List items) {
Database.getInstance().writeItems(items);
}
})
.subscribe(new Action1<List>() {
@OverRide
public void call(List items) {
cache.onNext(items);
}
}, new Action1() {
@OverRide
public void call(Throwable throwable) {
throwable.printStackTrace();
}
});
从网路获取数据后执行doOnNext先写入数据库,然后才执行subscribe里的call,这样就是网络获取数据后先写数据库再更新UI,我理解的没错吧?
实际应用中这种方式应该不可取吧,rxjava新手,这种类型的需求应该很普遍吧,实际应该应该怎么使用呢

有个业务上的问题

需要请求一个接口,根据返回的值,“成功” 再请求另一个接口,“失败” 显示失败原因。
请问该如何用rxjava实现?

BehaviourSubject示例的问题

代码中在演示BehaviourSubject如何使用时, 存在两个问题.

    1. Data类中loadFromNetwork()函数如果因为网络未连接而发生错误, 不会通知界面CacheFragment进行数据更新.
    1. 我尝试通过如下代码修复问题一:
public void loadFromNetwork() {
        Network.getGankApi()
                .getBeauties(100, 1)
                .subscribeOn(Schedulers.io())
                .map(GankBeautyResultToItemsMapper.getInstance())
                .doOnNext(new Action1<List<Item>>() {
                    @Override
                    public void call(List<Item> items) {
                        Database.getInstance().writeItems(items);
                    }
                })
                .subscribe(new Action1<List<Item>>() {
                    @Override
                    public void call(List<Item> items) {
                        cache.onNext(items);
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        throwable.printStackTrace();
                        //新增代码: 手动触发cache的错误回调函数
                    cache.onError(throwable);
                    }
                });
    }

修复完成之后发现, 若第一次请求因为网络不可用问题发生错误, 则在网络恢复之后重试请求时, 会直接触发onError函数, 原因是由于cache作为BehaviorSubject, 其中最后一个元素是Throwable. 一旦产生新的订阅, 则立即发送Throwable对象.

能否改变Model类里面的变量命名?

Model类里的变量命名和返回JSON中的名字必须一样吗?现在如果命名不一样就不能正确解析JSON取到数据,请问有没有什么方法可以让两者命名可以不统一?比如JSON的description在代码里我只想命名为desc
Model里面命名:
public class ZhuangbiImage { public String description; public String image_url; }
返回JSON格式:
"id": 204, "description": "\u4e0d\u80fd\u56e0\u4e3a\u6211\u8d85\u53ef\u7231\u4f60\u5c31\u6b3a\u8d1f\u6211\u554a", ... ... "image_url": "http:\/\/7xjzdd.com1.z0.glb.clouddn.com\/i\/2015-07-31-4c92424a38c5db9c01abd63203584e1d.png"

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.