2016-11-13 7 views
0

У меня есть одноэлементный класс Toast-показ, который отслеживает текущие тосты и отменяет его, когда он снова начал:Статический контекст, сохраненный в классе приложений и используемый в одноточечном тосте, создает ли утечку памяти?

public enum SingleToast { 
    INSTANCE; 

    private Toast currentToast; 
    private String currentMessage; 

    public void show(String message, int duration) { 
     if (message.equals(currentMessage)) { 
      currentToast.cancel(); 
     } 

     currentToast = Toast.makeText(App.getContext(), message, duration); 
     currentToast.show(); 

     currentMessage = message; 
    } 
} 

(Расширенное объяснения этого примера можно найти здесь: toast issue in android)

Основное отличие между ответом в ссылке и этой части кода - это контекст, который не передается как параметр. Я получаю его, используя статический контекст, сохраненный в классе App, который сохраняется при запуске приложения:

public class App extends Application { 
    private static Context context; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     context = getApplicationContext(); 
    } 

    public static Context getContext() { 
     return context; 
    } 
} 

Я прочитал об этом простом контексте решения в нескольких блогах, и это очень много помог в retreiving контекст в классах, для которых передающий контекст как параметры просто раздражает или даже невозможно.

Однако, интересно, создаю ли я утечку памяти!

Прежде всего: это статический контекст сам по себе вызывает утечку памяти (если да, то как я могу предотвратить это без необходимости проходить контекст всегда везде?)

Во-вторых: это проблема использовать контекст в объекте тоста и сохранить его как поле внутри одного элемента, даже если сам контекст не будет статическим?

ответ

1

Первый Нет, если вы сохраняете контекст только в приложении, как описано выше, это не приведет к утечке памяти.

О втором, это почти то же самое, что и в первом случае, но в первую очередь проще в реализации, чем во втором.