Reputation: 147
I've been reading a bit about Singleton pattern usage in Android and its disadvantages regarding to keeping the Context. In fact, when I implement the following code:
private static HttpManager sSingleton;
private Context mContext;
private HttpManager(Context context) {
mContext = context;
}
public static synchronized HttpManager getInstance(Context context) {
if (sSingleton == null) {
sSingleton = new HttpManager(context);
}
return sSingleton;
}
Android Studio shows me the following warning:
Do not place Android context classes in static fields (static reference to HttpManager which has field mContext pointing to Context); this is a memory leak and also breaks Instant Run.
However, I can see Singletons implemented and recommended in this page of Android's docs.
If your application makes constant use of the network, it's probably most efficient to set up a single instance of RequestQueue that will last the lifetime of your app. You can achieve this in various ways. The recommended approach is to implement a singleton class that encapsulates RequestQueue and other Volley functionality.
Since Google is contradicting itself, can someone guide me and advise me on this point?
Upvotes: 6
Views: 7838
Reputation: 1006869
Since Google is contradicting itself
No, it is not.
The quoted Lint warning is not complaining about creating singletons. It is complaining about creating singletons holding a reference to an arbitrary Context
, as that could be something like an Activity
. Hopefully, by changing mContext = context
to mContext = context.getApplicationContext()
, you will get rid of that warning (though it is possible that this still breaks Instant Run — I cannot really comment on that).
Creating singletons is fine, so long as you do so very carefully, to avoid memory leaks (e.g., holding an indefinite static
reference to an Activity
).
Upvotes: 23
Reputation: 939
This is indeed a contradiction, since in many singletons you will need a context. Have a look at this post, I am using now this approach to avoid the warning in android studio:
Android Singleton with Global Context
Upvotes: -2