2015-02-11 4 views
0

Я действительно новичок в разработке Android. В моем приложении я выполняю другую задачу async и должен сохранить результат из этой задачи в базу данных, которая требует context. Вдохновленный от this ответ Я начал использовать контекст во всех моих классах как переменную-член. Это казалось хорошим методом, но теперь ВСЕ моя фоновая задача и другие классы, которые имеют дело с предпочтением, имеют context как переменную-член. Пример кода -Использование контекста как переменной-члена во всех классах

public class Task extends AsyncTask<Void, Void, String> { 
    Context context; 

    public Task(Context context){ 
     super(); 
     this.context = context; 
    } 
    protected String doInBackground() { 
     //myAsyncTask 
    .. 
    } 
    .. 
    protected void onPostExecute(String response) { //response from the request 
     DbHelper helper = new DbHelper(context); 
     //save to db 
    } 

У меня есть около 3 или более таких задач, запущенных последовательно в разы. Поэтому, когда мне нужно выполнить фоновое задание, сначала нужно инициализировать задачу async контекстом, а затем инициализировать DbHelper с использованием этого контекста. Я чувствую, что делаю все неправильно. Теперь это не похоже на хороший метод (может привести к огромным утечкам памяти imo). Плюс это похоже на дублирование и что я могу получить доступ к контексту лучше.

Рекомендуется ли использовать такой контекст? Или у него есть недостаток, и мне лучше использовать какой-то другой метод? Что-то вроде

public class MyApplication extends Application { 
    private static Context context; 

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

    public static Context getAppContext() { 
     return MyApplication.context; 
     //use context as MyApplication.getAppContext(); 
    } 
} 

Какой из них лучше использовать?

ответ

0

Неправильно. Do NOT поддерживает ссылку на Context в любом месте, это дает утечку памяти, потому что тогда VM не может сбрасывать мусор Context. Мы также попробовали несколько решений, но все не удалось. Нет другого решения, кроме как передать Context всякий раз, когда вам это нужно (если вы посмотрите на API Android, вы увидите, что он также работает таким образом, и это по какой-то причине).

+0

Но не передает «контекст» везде, как имеющий статический доступ к контексту (что и делает второй метод). – aandis

+0

Нет, потому что вы сохраняете статическую ссылку на него: 'private static Context context;'. – m0skit0

+1

'applicationContext()' в любом случае живет до тех пор, пока приложение живет. Так почему же статическая ссылка на этот контекст плохая? – aandis

Смежные вопросы