拨打电话:
@GET("/user/{id}/data")
void getUserData(@Path("id") int id, Callback<Data> cb);
应该在主线程上执行回调(如果不使用RxJava)。我的问题是:
我正在寻找从Web服务中获取数据的方法,以避免我自己的线程管理(或使用其他方法,如IntentService等),但我也害怕使用RxJava(因为实验支持) )。有没有其他建议的方法来处理这个问题?
答案 0 :(得分:20)
解析发生在哪里(让我们假设我使用XML转换器进行流程响应)。这是主线程还是不同主线?它取决于转换器的实现吗?
无论您使用哪种转换器,都始终是后台线程。
如果我必须包含一些(重)验证规则/业务规则,我是否需要在callable中生成一个新线程?或者在Callback方法中完成它是否可以?
这是相当主观的,并且有很多方法可以解决它。默认情况下,Callback
将在主线程上执行。
您可以通过向Executor
提供自定义RestAdapter.Builder
来更改将调用回调的线程。这将影响RestAdapter
构建的所有服务,但这可能不是您想要的。
如果您要完成的工作可以与更新UI并行完成(例如,轻量级缓存),则从Callback
生成另一个线程(或在执行器上入队)没有错
如果在通知用户界面之前必须完成昂贵的工作,那么最好将方法切换为同步(无回调)并自行进行线程处理。这样,您可以在HTTP调用之前和之后执行昂贵的操作(文件i / o,缓存,转换,验证等)。
我们目前使用RxJava(其中Retrofit有实验支持)来满足您的要求:
interface Foo {
@GET("/")
Observable<Foo> getFoo(String bar);
}
foo.getFoo()
.mapMany(new ExpensiveOperationFunction())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<TransformedFoo>() { .. });