2014-09-10 51 views
1

http://square.github.io/retrofit/它谈论异步,有一个短语“可观察的请求异步订阅,并在执行HTTP请求的同一个线程上观察”,我想澄清。澄清RxJava可观察线程与改造

所以在这种情况下,实际上将执行HTTP请求的线程:比方说,主线程使得可观察到的getUserPhoto(@Path(“ID”)INT ID)打个电话?它会成为订阅执行http请求的请求的主线程或线程吗?

回答

1

关于该文件,这将是该执行请求的线程。

如果你的要求改变的东西在查看结果,您可能需要观察(消费)的结果在主线程。在这种情况下,请在订阅observable之前添加对observeOn方法的调用。

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(即改造过程中的用途之一) link它指出,它采用Android的处理器(其是用于处理线程类)

“它提供了一个调度器,它调度一个O可以在给定的Android Handler线程上使用bservable,特别是主UI线程。“

+0

感谢您的解释。我理解如何将主线程指定为响应回到观察者时使用的线程。但是从我想澄清的那句话来看,默认情况下它会使用线程执行HTTP请求。我仍然困惑谁实际执行http请求? – user2934804 2014-09-12 00:54:07

+0

您好,欢迎澄清一点,了解Android处理程序的实际工作方式可能更重要。这可以在Android文档中找到。基本上默认处理程序增加了一个“任务”变成了队列,以便在主UI线程有机会的话,这个任务将被执行,这是怎么过可能还创建另一个线程,因为的Runnable可以使用Android的处理器来实现,也它使用一个称为Looper的对象,它是Android线程管理框架的一部分。 – Jorch914 2014-09-12 03:17:49