所以@JakeWharton 说的是 RestAdapter 和 api 接口实例应该创建一次。你如何实现这一点几乎是一个实现细节。
您可以直接创建一个类,该类将为您的 RestAdapter 保存一个实例。您将负责只创建该类的单个实例。您可能希望在 Application 类中保留对此类的引用。你也可以使用Singleton pattern
这是一个帮助您入门的小课程。我从以前的帖子中获取了这个,你可以看到 here
public class RestApiDispencer {
private Map<String, Object> restApiInstances = new HashMap<String, Object>();
private RestAdapter restAdapter;
public RestApiDispencer(RestAdapter restAdapter) {
this.restAdapter = restAdapter;
}
public <T> T getRestApi(Class<T> clazz) {
T client = null;
if ((client = (T) restApiInstances.get(clazz.getCanonicalName())) != null) {
return client;
}
client = restAdapter.create(clazz);
restApiInstances.put(clazz.getCanonicalName(), client);
return client;
}
}
如果您熟悉依赖注入,那将是另一种方法。我个人更喜欢使用依赖注入来隐藏实现细节。
将 RestAdapter 直接创建到您的 Activity 中并不是您想要的方式。相反,在您的活动中,您希望从上面获取对此 RestApiDispencer 类的引用,并通过像这样提供它的类,让它返回您选择的其余 api 的实例。
MyClassApi myClassApi = restApiDispencer.getRestApi(MyClassApi.class);
还有其他方法可以实现这一点,但正如我所说,由您决定哪种实现最适合您的需求。
至于 Retrofit 在单独的线程上执行请求,是的,但您需要相应地创建您的 Api 接口。
@GET(/some/rest/api/path)
Response getApiData() // Synchronous declaration as the Response is returned from the method.
@GET(/some/rest/api/path)
void getApiData(Callback<Response> callback); // Asynchronous as the Response is delivered in the callback.
@GET(/some/rest/api/path)
Observable<Response> getApiData(); // Asynchronous again but you'll need to read up on rx-java before using this.
阅读 rx-java here
因此,如果您决定使用异步签名来创建您的 REST API,那么您在调用接口时就不必担心线程问题。如果您使用同步签名,那么一切都取决于您。