在Retrofit中,“回调将在执行HTTP请求的同一个线程上发生”是什么意思?

时间:2015-03-17 18:30:52

标签: android retrofit

Retrofit Documentation声明如下:

  

对于桌面应用程序,回调将在执行HTTP请求的同一线程上发生。

我试图通过研究改造源(特别是RestAdapter.java)并查看其他一些类似的SO问题(例如this)来理解这一点,但我仍然感到困惑。

如果我有一个调用void getUserPhoto(@Path("id") int id, Callback<Photo> cb)的后台线程(例如),那么 该库是如何在该线程上执行回调的呢?

1 个答案:

答案 0 :(得分:3)

如果您将同一执行人传递给RestAdapter,请说:

ExecutorService backgroundExecutor = Executors.newCachedThreadPool();
restAdapterBuilder.setExecutors(backgroundExecutor, backgroundExecutor);

然后将在此后台执行程序上执行回调Runnable,这意味着您将在同一个线程中接收回调,否则该线程将被关闭或重用,并且回调将在与执行的线程不同的线程上发生http请求。

Retrofit检查您是否在桌面应用程序或Android应用程序上运行它时,它会检查android sdk是否存在当前程序包,然后获取http请求的执行程序并且将发生回调,即如果您在Android上运行,它将在主线程上运行回调Runnable。如果您在非Android上运行,它将获得同步执行程序(与http请求相同),除非您不传递其他内容。这些是构建的默认平台设置,如果您自己不这样做的话。