2012-03-02 3 views
2

5 초마다 텍스트를 업데이트하고 싶습니다. 그렇게 할 타이머를 만들었습니다. 그러나 첫 번째 업데이트 이후에는 상자를 다시 업데이트하지 않습니다. 내가보기 또는 무언가를 새로 고쳐야한다고 가정하고 있지만 지금은 어떻게 생각하십니까?동적 텍스트로 UI 업데이트

public class HomeActivity extends Activity implements OnClickListener { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     textTitle = (TextView) findViewById(R.id.textTitle); 
     textArtist = (TextView) findViewById(R.id.textArtist); 
     timedMeta(); 
} 
static void timedMeta() 
{ 
    timer.scheduleAtFixedRate( 
     new TimerTask() { 
      public void run() { 
       try{  
        textTitle.setText(title); 
        textArtist.setText(artist); 
        } 
       Thread.sleep(UPDATE_INTERVAL); 
       catch (Exception e) 
       { 
       }, 
       DELAY_INTERVAL, 
       UPDATE_INTERVAL); 
      } 
     } 
    ) 
} 
+0

텍스트는 앱의 전체 수명 동안 5 초마다 업데이트 될 예정입니까? 또는 분당 5 초 (예 :)? – Rawr

+0

먼저 Thread.sleep을 제거하고 작동해야합니다 ... 부는 타이틀과 아티스트 필드를 설정하는 방법에 따라 달라집니다. 편집 : 예 Rawr는 5 초마다 배터리를 죽일 것입니다. – Selvin

답변

4

저는 Handler를 사용합니다.

private static final int WHAT = 1; 
private static final int TIME_TO_WAIT = 5000; 

Handler regularHandler = new Handler(new Handler.Callback() { 
    public boolean handleMessage(Message msg) { 
     // Do stuff 

     regularHandler.sendEmptyMessageDelayed(msg.what, TIME_TO_WAIT); 

     return true; 
    } 
}); 

regularHandler.sendEmptyMessageDelayed(WHAT, TIME_TO_WAIT); 

예를 들어, 5000 밀리 초마다 "할 일"이 있습니다. 다른 정수로 WHAT을 전달하고 handleMessage 함수에서 WHAT을 처리하여 Handler가 다른 이벤트에 반응하도록 할 수 있습니다.

편집 : 일반적으로 상수와 구성원으로 클래스의 핸들러와 onResume에서 regularHandler.sendEmptyMessageDelayed (...)를() {} 배치 할

또한 {) (onPause이 되었는데요 }

regularHandler.removeMessages(WHAT) 

Edit2가 : 예 :

당신이 onPause에 넣어하지 않는 경우 승 핸들러가 루프를 계속하기 때문에 당신은 onResume()와 onPause()에서 할 필요가
public class HomeActivity extends Activity implements OnClickListener { 
    private static final int WHAT = 1; 
    private static final int TIME_TO_WAIT = 5000; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     textTitle = (TextView) findViewById(R.id.textTitle); 
     textArtist = (TextView) findViewById(R.id.textArtist); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     regularHandler.sendEmptyMessageDelayed(WHAT, TIME_TO_WAIT); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     regularHandler.removeMessages(WHAT); 
    } 

    Handler regularHandler = new Handler(new Handler.Callback() { 
     public boolean handleMessage(Message msg) { 
      // Do stuff 

      regularHandler.sendEmptyMessageDelayed(msg.what, TIME_TO_WAIT); 

      return true; 
     } 
    }); 
} 

당신의 활동이 포 그라운드에 있지 않습니다. 포어 그라운드으로 돌아 왔을 때 루프가 다시 활성화되기를 원할 것입니다 (그러므로 onResume()).

+0

작은 예제를 줄 수 있습니까? 어떻게 타이머와 통합 할 것인가? 그들은 거의 대립한다. – Brianjs

+0

타이머를 완전히 제거하라. 그것이 바로 핸들러이다. – Knossos

2

핸들러를 사용하는 것이 좋은 전략이지만 사용자 정의 콜백이 필요하지 않습니다. 대신 Runnable과 함께 postDelayed을 사용할 수 있습니다. 구현에 대한 자세한 내용은 Android doc을 참조하십시오.

2
runOnUiThread(new Runnable() { 
    public void run() { 
     textTitle.setText(title); 
    } 
}); 

백그라운드 스레드에서 UI를 업데이트 할 수 없습니다. UI 수정을 원할 때마다 UI 스레드를 사용하는 것이 좋습니다