在它谈到异步的http://square.github.io/retrofit/处,有一句话“可观察的请求是异步订阅的,并在执行HTTP请求的同一线程上观察到”,我想澄清一下。
所以在这种情况下哪个线程实际上会执行Http请求:让我们说主线程调用Observable getUserPhoto(@Path(“id”)int id)?它是订阅执行http请求的请求的主线程或线程吗?
答案 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;