Статический контекст в классе приложения - утечка памяти - PullRequest
0 голосов
/ 17 октября 2018

Чтобы иметь возможность получить контекст приложения в любом месте моего приложения, я создал класс приложения следующим образом:

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 голосов
/ 17 октября 2018

Нет необходимости использовать статический для контекста доступа, вы можете использовать получить контекст, получить контекст приложения или получить активность в любом месте.насколько это возможно, вы должны избегать передачи контекста.как это во фрагментах: 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);
}
0 голосов
/ 17 октября 2018

Никогда не помещайте статический контекст в ваше приложение, так как это вызовет непредвиденные утечки памяти, однако, если вы все еще хотите использовать статический контекст в своем приложении, вы можете заключить контекст в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...