在http://square.github.io/retrofit/它谈论异步,有一个短语“可观察的请求异步订阅,并在执行HTTP请求的同一个线程上观察”,我想澄清。澄清RxJava可观察线程与改造
所以在这种情况下,实际上将执行HTTP请求的线程:比方说,主线程使得可观察到的getUserPhoto(@Path(“ID”)INT ID)打个电话?它会成为订阅执行http请求的请求的主线程或线程吗?
在http://square.github.io/retrofit/它谈论异步,有一个短语“可观察的请求异步订阅,并在执行HTTP请求的同一个线程上观察”,我想澄清。澄清RxJava可观察线程与改造
所以在这种情况下,实际上将执行HTTP请求的线程:比方说,主线程使得可观察到的getUserPhoto(@Path(“ID”)INT ID)打个电话?它会成为订阅执行http请求的请求的主线程或线程吗?
关于该文件,这将是该执行请求的线程。
如果你的要求改变的东西在查看结果,您可能需要观察(消费)的结果在主线程。在这种情况下,请在订阅observable之前添加对observeOn方法的调用。
答案是肯定的,当你使用服务执行你的方法时,使用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线程。“
感谢您的解释。我理解如何将主线程指定为响应回到观察者时使用的线程。但是从我想澄清的那句话来看,默认情况下它会使用线程执行HTTP请求。我仍然困惑谁实际执行http请求? – user2934804 2014-09-12 00:54:07
您好,欢迎澄清一点,了解Android处理程序的实际工作方式可能更重要。这可以在Android文档中找到。基本上默认处理程序增加了一个“任务”变成了队列,以便在主UI线程有机会的话,这个任务将被执行,这是怎么过可能还创建另一个线程,因为的Runnable可以使用Android的处理器来实现,也它使用一个称为Looper的对象,它是Android线程管理框架的一部分。 – Jorch914 2014-09-12 03:17:49