2016-08-29 4 views
1

AsyncTask가 실행 중이고이 스레드에서 runOnUiThread를 시작하여 내보기를 조작합니다. 내 AsyncTask를 닫으면 RunOnUiThread가 AsyncTask를 닫은 후 1 시간 더 오래 실행됩니다. runOnUiThread를 닫으려면 어떻게해야합니까? 감사!닫기 runOnUiThread

@Override 
protected String doInBackground(String... params) { 
    while(running.get()) { 

     // Background thread sleeps 
     try { 
      Thread.sleep(produceRadwaste_countdown * 1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     // UI thread touching some view elements 
     activity.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       radwasteTon.incrementStack(); 
      } 
     }); 

     // Delete thread if player is game over 
     if(GameLogic.isGameOver()) { 
      clearThreads(); 
     } 
    } 

    return "Running"; 
} 

public void clearThreads() { 
    running.set(false); 
    this.cancel(true); 
} 

답변

2

다른 해결책을 제안 할 수 있습니까?

AsyncTask에서 onProgressUpdate (Params ...) 메소드를 구현하십시오. 그런 다음 doInBackground (params ...)에서 publishProgess를 호출 할 수 있습니다.

onProgressUpdate (Params ...)는 UI 스레드에서 실행됩니다.

+0

감사합니다. UI에서 작동하고 runOnUiThread가 필요하지 않지만 스레드를 취소 한 후에도 1 시간 후에 실행됩니다. – Ghork

+1

전체 프로세스를 logcat으로 확인했는데 때로는 실행하기 때문에 약간 이상했습니다. boolean 이상의 게임을 검사하기 전에 publishProgress()를 호출하고 publishProgress()를 실행하기 전에 부울을 검사하기도합니다. 이제는이 두 작업 사이에 작은 Thread.sleep을 수행하고 있습니다. 그러나 이것이 최선의 해결책은 아니라고 생각합니다. – Ghork

+0

AsyncTask에는 최대 풀 크기가 있으며이 스레드는 각 게임 아이콘에서 실행되며 약 5 - 10 개의 항목을 갖기 때문에 내 게임에는 매우 나쁜 것이 될 것이라고 읽었습니다. – Ghork