2016-09-24 4 views
0

나머지 시간 (초)을 표시하는 android에서 textview를 만들려고합니다.runOnUiThread가 제대로 작동하지 않습니다.

runOnUiThread 및 Hadnler를 사용했는데 모든 것이 잘 작동하는 것 같습니다 (sysout 및 디버그는 두 스레드가 모두 실행되고 값이 적절히 업데이트되었음을 ​​보여줍니다). 그러나 UI에서 textview 값이 제대로 업데이트되지 않습니다. 스레드가 완료되면 마지막 값으로 업데이트됩니다.

아래 코드를 개인적인 방법으로 작성했습니다.

최종 TextView timerText = (TextView) mainView.findViewById (R.id.timerText); timerText.setText (R.string.maxAllowedSeconds);

handler.post(new Runnable() { 
     @Override 
     public void run() { 
      while(true) 
      { 
       System.out.println("Text:"+ ""+maxAllowedSeconds); 
       try { 
        TimeUnit.SECONDS.sleep(1); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       maxAllowedSeconds--; 
       if(maxAllowedSeconds <= 0) 
        break; 
       getActivity().runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         System.out.println("Running on UI Thread : " + maxAllowedSeconds); 
         timerText.setText("" + maxAllowedSeconds); 
        } 
       }); 
      } 
     } 
    }); 

이 영역의 이전 질문 중 많은 부분은이 문제에 대한 구체적인 해결책이없는 것 같습니다.

미리 감사드립니다.

SOLUTOIN :

마지막으로 나는 예상대로 완벽하게 작동 AsynchTask을 사용했다.

private class RapidFireAsyncTimerTask extends AsyncTask<Integer, Integer, Void> { 

     private Context context; 
     private View rootView; 

     public RapidFireAsyncTimerTask(Context ctx, View rootView) { 

      this.context = ctx; 
      this.rootView = rootView; 
     } 

     @Override 
     protected Void doInBackground(Integer... params) { 

      int maxSec= params[0]; 
      while (true) { 
       try { 
        TimeUnit.SECONDS.sleep(1); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       publishProgress(--maxSec); 
       if (maxSec <= 0) 
        break; 
      } 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(final Integer... values) { 

      ((TextView) rootView.findViewById(R.id.timerText)).setText("" + values[0]); 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 

      //next task 
     } 
    } 

답변

0

처리기 대신, AsynchTask와 함께 작동합니다 (runOnUiThread는 필요하지 않음).

public RapidFireAsyncTimerTask(Context ctx, View rootView) { 

     this.context = ctx; 
     this.rootView = rootView; 
    } 

    @Override 
    protected Void doInBackground(Integer... params) { 

     int maxSec= params[0]; 
     while (true) { 
      try { 
       TimeUnit.SECONDS.sleep(1); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      publishProgress(--maxSec); 
      if (maxSec <= 0) 
       break; 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(final Integer... values) { 

     ((TextView) rootView.findViewById(R.id.timerText)).setText("" + values[0]); 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 

     //next task 
    } 
} 
관련 문제