App类中的静态上下文-内存泄漏

时间:2018-10-17 06:35:54

标签: java android memory-leaks static

为了能够在我的应用程序中的任何地方获取应用程序上下文,我创建了这样的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会警告这种方法(静态上下文字段)会导致内存泄漏。

您是否知道如何避免使用静态上下文字段,但获得类似功能?

2 个答案:

答案 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);
}
相关问题