为了能够在我的应用程序中的任何地方获取应用程序上下文,我创建了这样的App类:
public class App extends Application
{
private static Context mContext;
public static Context getContext()
{
return mContext;
}
@Override
public void onCreate()
{
super.onCreate();
mContext = this
}
}
它可以工作,并且在我的应用程序中很多需要使用上下文(例如,加载资源)且无法注入其他上下文才能使用的地方使用。
但是,Android Studio会警告这种方法(静态上下文字段)会导致内存泄漏。
您是否知道如何避免使用静态上下文字段,但获得类似功能?
答案 0 :(得分:1)
请不要在应用程序中放置静态上下文,因为这会导致异常的内存泄漏,但是,如果您仍然希望在应用程序中使用静态上下文,则可以将上下文包装在WeakReference中,以便进行更改
private static Context mContext;
到
private static WeakReference<Context> mContext;
并在创建时将其更改为
mContext = new WeakReference<>(Context);
最后使用
public static Context getContext() {
return mContext.get();
}
如果您想了解有关WeakRef的更多信息,请使用下面的链接, https://developer.android.com/reference/java/lang/ref/WeakReference
答案 1 :(得分:1)
访问上下文不必使用静态,您可以在任何地方使用get上下文,get应用程序上下文或获取活动。
尽可能避免传递上下文。
像这样的片段:DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(getContext(), layoutManager.getOrientation());
,在这种情况下(如果OP希望在该类不承载Context方法的地方使用Context),则可以传递上下文而无需将其定义为静态。 例如:
public class DashboardWalletSpinnerAdapter extends ArrayAdapter<Wallet> {
private LayoutInflater mLayoutInflater;
private static final int CLOSE = 0;
private static final int OPEN = 1;
public DashboardWalletSpinnerAdapter(Context mContext, List<Wallet> walletList) {
super(mContext, R.layout.spinneritemclose_dashbaord, walletList);
mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}