【问题标题】:Clarifying RxJava Observable Threading with Retrofit用 Retrofit 阐明 RxJava 可观察线程
【发布时间】:2014-11-04 14:01:36
【问题描述】:

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

那么在这种情况下,哪个线程将实际执行 Http 请求:假设主线程调用 Observable getUserPhoto(@Path("id") int id)?执行http请求的会是主线程还是订阅请求的线程?

【问题讨论】:

    标签: retrofit


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      答案是肯定的,当您使用服务执行您的方法时,使用 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(这是一个用于处理线程的类)

      “它提供了一个调度器,用于在给定的 Android Handler 线程上调度 Observable,尤其是主 UI 线程。”

      【讨论】:

      • 感谢您的解释。我了解我们如何将主线程指定为响应回击到观察者时使用的线程。但是,从我想澄清的短语来看,默认情况下它表示它将使用线程来执行 HTTP 请求。我仍然很困惑谁真正执行了 http 请求?
      • 欢迎您,澄清一点也许更重要的是了解 Android 处理程序的实际工作方式。这可以通过在 Android 文档中搜索找到。基本上默认情况下,处理程序将“任务”添加到队列中,因此当主 UI 线程有机会时,将执行此任务,但如何也可以创建另一个线程,因为 Runnables 可以使用 Android 的处理程序来实现,它也是使用称为 Looper 的对象,它是 Android 线程管理框架的一部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多