Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应用程序类中的静态上下文-内存泄漏_Java_Android_Memory Leaks_Static - Fatal编程技术网

Java 应用程序类中的静态上下文-内存泄漏

Java 应用程序类中的静态上下文-内存泄漏,java,android,memory-leaks,static,Java,Android,Memory Leaks,Static,为了能够在我的应用程序中的任何位置获取应用程序上下文,我创建了如下应用程序类: public class App extends Application { private static Context mContext; public static Context getContext() { return mContext; } @Override public void onCreate() {

为了能够在我的应用程序中的任何位置获取应用程序上下文,我创建了如下应用程序类:

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发出警告:这种方法(静态上下文字段)会导致内存泄漏


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

切勿在应用程序中放置静态上下文,因为它会导致未经接受的内存泄漏,但是如果您仍然希望在应用程序中使用静态上下文,则可以将上下文包装在WeakReference中,以便进行更改

private static Context mContext;

如果您想了解更多关于WeakRef的信息,请使用下面的链接,
访问上下文不必使用静态,您可以在任何地方使用get-context、get-application-context或get-activity。 您应该尽可能避免传递上下文。 在片段中类似这样:
DividerItemDecoration DividerItemDecoration=newdivideritemdecoration(getContext(),layoutManager.getOrientation())

在这种情况下(如果OP希望在类不承载上下文方法的情况下使用上下文),您可以传递上下文而不将其定义为静态。 例如:

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);
}
公共类仪表板WalletSpinerAdapter扩展了ArrayAdapter{
私人停车场平面布置;
私有静态最终int CLOSE=0;
专用静态最终int OPEN=1;
公用仪表板WalletSpinerAdapter(上下文mContext、列表walletList){
超级(McContext,R.layout.spinneritemclose_dashbaord,walletList);
mLayoutInflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
}

相关我发现建议使用
App
而不是
Context
,不再发出警告,但这真的是有效的解决方案吗?这不是很准确,如果OP想在类不承载Context方法的情况下使用Context怎么办?是的,有时我想在activity/fragment等外部获取Context。@Rab,你可以传递context不将其定义为static在我的情况下,使用
WeakReference
或将
Context
数据类型更改为
App
?这两种解决方案都会导致停止警告。App仍然会导致泄漏,你怎么也可以在WeakReference中包装应用程序来停止它,做你最喜欢的事情。我想我会包装
Context
使用
WeakReference
,我希望它能有所帮助。事实上,我的应用程序有时会挂在启动屏幕上,我怀疑这是因为垃圾收集,也可能是由类似这样的内存泄漏造成的,现在我正试图找出任何可能的原因
mContext = new WeakReference<>(Context);
public static Context getContext() {
    return mContext.get();
}
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);
}