2014-10-22 2 views
0

데이터를 새로 고치려면 10 초 후에 AsyncTask를 다시 시작하려고합니다. 하지만 몇 가지 코드가 있지만 AsyncTask를 실행하는 데 몇 초가 지나면 OutOfMemory 예외가 throw됩니다. 이것을 처리하는 가장 좋은 방법은 무엇입니까? 여기 AsyncTask를 재실행하여 데이터를 새로 고치려면 OutOfMemoryException

내 코드입니다 :

AsyncTask를

private class LoadQueueTask extends AsyncTask<Void, Void, Queue> 
    { 

     @Override 
     protected Queue doInBackground(Void... arg0) { 
      Model model = Model.getInstance(); 
      return model.getQueue(); 
     } 
     @Override 
     protected void onPostExecute(Queue result) { 
      super.onPostExecute(result); 
      adapter = new QueueAdapter(getSherlockActivity(), R.layout.item_queue, result.getSlots()); 
      listview.setAdapter(adapter); 
      listview.setEmptyView(empty); 
      if(adapter.getCount() != 0) 
      { 
       callAsynchronousTask(); 
      } 
     } 

    } 

TIMER

public void callAsynchronousTask() { 
     final Handler handler = new Handler(); 
     Timer timer = new Timer(); 
     TimerTask doAsynchronousTask = new TimerTask() {  
      @Override 
      public void run() { 
       handler.post(new Runnable() { 
        public void run() {  
         try { 
          new LoadQueueTask().execute(); 
         } catch (Exception e) { 
         } 
        } 
       }); 
      } 
     }; 
     timer.schedule(doAsynchronousTask, 0, 10000); 
    } 

어댑터

012 onCreate 방법에서, 예를 들어,

if(adapter.getCount() != 0) 
{ 
    callAsynchronousTask(); 
} 

전화 코드의 일부 한 번에 callAsynchronousTask 방법 :

+0

당신이보고 싶다면 나는 게시 할 수 있습니다. – Timmeeh93

+0

좋아, 그것을 공유 할 수 있지만 그것은 또한 무한 루프가 아닙니다; if (adapter.getCount()! = 0) { callAsynchronousTask(); } – Devrim

+0

긴 루프를 알고 있지만 30000의 타이머도 있습니다 – Timmeeh93

답변

1

onPostExecute 방법에 코드의이 부분을 제거합니다.

이유 : 현재 구현에서는 첫 번째 타이머 인스턴스가 시작되어 LoadQueueTask의 인스턴스를 실행합니다. 실행이 끝나면 callAsynchronousTask을 다시 호출하고 타이머의 새 인스턴스를 만들고이 타이머는 즉시 LoadQueueTask의 인스턴스를 실행합니다. (이전 타이머는 여전히 10 초 동안 대기합니다). 따라서 많은 타이머를 만들고 LoadQueueTask이 끝나면 바로 시작하여 메모리 부족 예외 (무한 루프와 같은)가 발생합니다.

제안 된 편집 : 단일 타이머를 만들고 10 초마다 LoadQueueTask을 실행합니다.

관련 문제