2014-07-10 5 views
1

Im using AsyncTask, называемый GetSalesTask, как внутренний класс в моей деятельности, но кажется, что он протекает, я вижу много экземпляров, живых из одного и того же класса GetSalesTask, другими словами кажется, что экземпляры GetSalesTask живы и не очищаются из памяти. Не могли бы вы указать, где моя проблема?утечка памяти с использованием AsyncTask как внутреннего класса

class LeekClass extends BaseProfileActivity{ 
    void callTask() 
    { 
     new GetSaleTask().execute(); 
    } 
    private class GetSalesTask extends AsyncTask<Void, Void, Boolean> { 

      @Override 
      protected void onPreExecute() { 
       showList(true); 
       super.onPreExecute(); 
      } 

      @Override 
      protected Boolean doInBackground(Void... params) { 
        List<Sale> saleList = get Data From Database 
        mItems.clear(); 
        mItems.addAll(saleList); 
        if (saleList.size() > 0) 
         return true; 
        else 
         return false; 
       return false; 
      } 

      @Override 
      protected void onPostExecute(Boolean result) { 
       BaseProfileActivity baseAct = (BaseProfileActivity) getActivity(); 
       if (baseAct != null && getView() != null && mAdapter != null) { 
        mAdapter.notifyDataSetChanged(); 
        showList(true); 
        baseAct.getProgress().setVisibility(View.GONE); 
       } 
      } 
     } 
} 

Методы showList (true); GetView(); и переменные mItems, mAdapter определены в активности.

+5

Вы должны ознакомиться с http://simonvt.net/2014/04/17/asynctask-is-bad-and-you-should-feel-bad/. Вы сохраняете ссылку на свою деятельность, означающую, что она не получит GC'ed до вашей активности. – zgc7009

+0

@ zgc7009, хорошая ссылка! – mapodev

ответ

1

Рассмотрите возможность задания задачи на значение null в onPostExecute и проверку нуля перед запуском задачи. GC должен теоретически отследить до нулевого значения и определить, что все в порядке, чтобы очистить.

if (myTask==null) { 
    myTask = new getSaleTask(); 
    myTask.execute(); 
} 

где-то в onPostExecute();

myTask =null; 

Я перешел к выполнению выше, и передавая WeakReference<T> Проходят WeakReference к классу. Это проще для меня сделать в конструкторе. Ниже я передаю класс WeakReference<Context>. Сохраните weakReference в конструкторе класса.

new getSaleTask(new WeakReference<Context>(getApplicationContext()); 

public getSaleTask(WeakReference<Context> weakReference){ 
    this.weakReference = weakReference; 
} 

то в классе вы получаете WeakReference следующим образом.

Context context = weakReference.get(); 

По какой-либо причине установлено, что для параметра weakReference установлено значение null, когда задача завершена.

+0

Спасибо за ответ. Я поставил решение, как вы сказали, я проверяю, запущена ли задача, прежде чем я начну ее. Около недели ссылки, чтобы быть честными, это первый раз, когда я встречаю их, и это говорит о том, что они могут быть полезными. Любое интересное сообщение на WeakReferences? Спасибо – user1796624

+0

Единственное, что я видел на weakReference, было на developer.android.com? – danny117

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