【发布时间】:2014-11-04 14:01:36
【问题描述】:
在 http://square.github.io/retrofit/ 谈到异步时,我想澄清一句“可观察的请求是异步订阅的,并在执行 HTTP 请求的同一线程上观察”。
那么在这种情况下,哪个线程将实际执行 Http 请求:假设主线程调用 Observable getUserPhoto(@Path("id") int id)?执行http请求的会是主线程还是订阅请求的线程?
【问题讨论】:
标签: retrofit
在 http://square.github.io/retrofit/ 谈到异步时,我想澄清一句“可观察的请求是异步订阅的,并在执行 HTTP 请求的同一线程上观察”。
那么在这种情况下,哪个线程将实际执行 Http 请求:假设主线程调用 Observable getUserPhoto(@Path("id") int id)?执行http请求的会是主线程还是订阅请求的线程?
【问题讨论】:
标签: retrofit
关于文档,它将是执行请求的线程。
如果您的请求结果改变了视图中的某些内容,您可能需要在主线程中观察(使用)您的结果。在这种情况下,在订阅 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(Retrofits 当然使用的那个)link,它声明它使用 Android 的 Handler(这是一个用于处理线程的类)
“它提供了一个调度器,用于在给定的 Android Handler 线程上调度 Observable,尤其是主 UI 线程。”
【讨论】: