对于桌面应用程序,回调将在执行HTTP请求的同一线程上发生。
我试图通过研究改造源(特别是RestAdapter.java
)并查看其他一些类似的SO问题(例如this)来理解这一点,但我仍然感到困惑。
如果我有一个调用void getUserPhoto(@Path("id") int id, Callback<Photo> cb)
的后台线程(例如),那么 该库是如何在该线程上执行回调的呢?
答案 0 :(得分:3)
如果您将同一执行人传递给RestAdapter
,请说:
ExecutorService backgroundExecutor = Executors.newCachedThreadPool();
restAdapterBuilder.setExecutors(backgroundExecutor, backgroundExecutor);
然后将在此后台执行程序上执行回调Runnable
,这意味着您将在同一个线程中接收回调,否则该线程将被关闭或重用,并且回调将在与执行的线程不同的线程上发生http请求。
当Retrofit
检查您是否在桌面应用程序或Android应用程序上运行它时,它会检查android sdk是否存在当前程序包,然后获取http请求的执行程序并且将发生回调,即如果您在Android上运行,它将在主线程上运行回调Runnable
。如果您在非Android上运行,它将获得同步执行程序(与http请求相同),除非您不传递其他内容。这些是构建的默认平台设置,如果您自己不这样做的话。