在Android中将引用附加到Retrofit适配器的位置?

时间:2014-08-12 22:27:31

标签: android retrofit

我正在引用这篇文章Where to keep Retrofit Adapter in Android App?但由于stackoverflow限制,我不允许在那里发表评论[感谢stackoverflow对待像孩子这样的新用户]。

使用Android时,Retrofit RestAdpater会去哪里?任何人都可以详细说明@Jake Wharton对上述帖子的回答。

当我将RestAdapter放置在我的Activity中时,它可能会在Activity被销毁时获得GCed,因此Singleton会丢失它的引用,并且需要在下次重新创建(我假设)。

此外,我为测试做的第一件事就是这个,Android告诉我我不能在主线程上做网络请求。我知道我不能这样做,但我认为Retrofit会自动为我创建一个单独的线程。

我是否需要创建AsyncTask来托管RestAdapter?或者这对Android有何用处?适配器最佳实例化在哪里?附加Retrofit参考的推荐点是什么?

1 个答案:

答案 0 :(得分:1)

所以@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;
    }
}

如果您熟悉依赖注入,那么这将是另一种方式。我个人更喜欢使用依赖注入来隐藏使用中的实现细节。

直接在您的Activity中创建RestAdapter并不是您想要的方式。相反,在您的活动中,您希望从上面获取对此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,那么在调用你的界面时你不必担心线程。如果你使用同步签名,那么一切都取决于你。