15

用这样的电话:

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

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

  1. 解析发生在哪里(假设我使用 XML 转换器进行流程响应)。这是主线程,还是其他线程?它是否取决于转换器的实现?
  2. 如果我必须包含一些(重)验证规则/业务规则,我是否需要在 callable 中生成一个新线程?或者在回调方法中完成它是否可以?

我正在寻找从 Web 服务获取活动数据的方法,避免我自己进行线程管理(或使用 IntentService 等其他方法),但我也害怕使用 RxJava(因为实验支持)。是否有另一种建议的方法来处理这个问题?

4

1 回答 1

22

解析发生在哪里(假设我使用 XML 转换器进行流程响应)。这是主线程,还是其他线程?它是否取决于转换器的实现?

无论您使用何种转换器,始终是后台线程。

如果我必须包含一些(重)验证规则/业务规则,我是否需要在 callable 中生成一个新线程?或者在回调方法中完成它是否可以?

这是相当主观的,有很多方法可以解决它。默认情况下Callback将在主线程上执行。

您可以通过ExecutorRestAdapter.Builder. 但是,这将影响由 that 构建的所有服务RestAdapter,这可能不是您想要的。

Callback如果您想要完成的工作可以与更新 UI 并行完成(例如,轻量级缓存),那么生成另一个线程(或在执行程序上排队)没有任何问题。

如果必须在通知 UI 之前完成昂贵的工作,那么最好将方法切换为同步(无回调)并自己进行线程处理。这样,您可以在 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>() { .. });
于 2014-02-09T20:48:34.223 回答