在主线程上进行回调

时间:2014-02-08 22:15:51

标签: android retrofit

拨打电话:

@GET("/user/{id}/data")
void getUserData(@Path("id") int id, Callback<Data> cb);

应该在主线程上执行回调(如果不使用RxJava)。我的问题是:

  1. 解析发生在哪里(让我们假设我使用XML转换器进行流程响应)。这是主线程还是不同主线?它取决于转换器的实现吗?
  2. 如果我必须包含一些(重)验证规则/业务规则,我是否需要在callable中生成一个新线程?或者在Callback方法中完成它是否可以?
  3. 我正在寻找从Web服务中获取数据的方法,以避免我自己的线程管理(或使用其他方法,如IntentService等),但我也害怕使用RxJava(因为实验支持) )。有没有其他建议的方法来处理这个问题?

1 个答案:

答案 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>() { .. });