使用Retrofit澄清RxJava可观察线程

时间:2014-09-10 19:30:57

标签: retrofit

在它谈到异步的http://square.github.io/retrofit/处,有一句话“可观察的请求是异步订阅的,并在执行HTTP请求的同一线程上观察到”,我想澄清一下。

所以在这种情况下哪个线程实际上会执行Http请求:让我们说主线程调用Observable getUserPhoto(@Path(“id”)int id)?它是订阅执行http请求的请求的主线程或线程吗?

2 个答案:

答案 0 :(得分:1)

关于文档,它将是执行请求的线程。

如果您的请求结果在视图中发生了变化,您可能需要在主线程中观察(使用)您的结果。在这种情况下,在订阅observable之前添加对observeOn方法的调用。

答案 1 :(得分:1)

答案是肯定的,当您使用服务执行方法时,使用observeOn方法将创建一个" Observer"一旦mainThread有机会这样做,它将等待执行请求的机会。

首先使用.observeOn(AndroidSchedulers.mainThread())观察主线程,然后订阅一旦从远程API获得响应就会执行的操作或回调。

假设您在API接口中使用此批注

@GET("/home")
Observable<Response> getHome();

这将是一个例子:

 service.getHome().observeOn(AndroidSchedulers.mainThread()).subscribe(
               new Action1<Response>() {
                    @Override
                    public void call(Response response) {
                        System.out.println("Response home");
                        System.out.println(response.getStatus());
                        System.out.println(response.getBody().mimeType());
                        System.out.println(response.getReason());
                        System.out.println(response.getUrl());
                        StringWriter w = new StringWriter();
                        try{
                            IOUtils.copy(response.getBody().in(),w,"UTF-8");
                            System.out.println(w.toString());
                        }catch (IOException e){}

                    }
               });

有关更多信息,您可以查看此RxJava(当然是Retrofits使用的那个)link,其中声明它使用Android的Handler(这是一个处理线程的类)

&#34;它提供了一个Scheduler,用于在给定的Android Handler线程上调度Observable,特别是主UI线程。&#34;