2011-04-06 3 views
0

나는 안드로이드 애플 리케이션에서 텍스트를 지속적으로 업데이트하려고합니다. 그러나 내 앱이 매번 충돌합니다.안드로이드 스레드 문제

package org.pgvw.main; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class InertialView extends Activity { 
    TextView tv; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     tv = new TextView(this); 
     tv.setText("Time: "); 
     new Thread(new Runnable() { 
      public void run() { 
       while(true) { 
        try { 
         Thread.currentThread().sleep(100); 
         tv.setText("Time: " + System.currentTimeMillis()); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }).start(); 
     setContentView(tv); 
    } 
} 

사람이 실수를 발견 할 수 :

이 내 코드?

인사말 및 트위터!

답변

2

x 밀리 초마다 UI를 업데이트하기 위해 추가 스레드를 시작할 필요가 없다고 생각하십시오. 추가 된 스레드의 추가 오버 헤드는 시간이 많이 소요되는 작업 인 경우 정당화됩니다. 다음 예제에서 버튼 클릭시 타이머가 시작됩니다. 이 코드는 새 스레드를 만들지 않습니다.

private Handler myHandler= new Handler(){ 
    @Override 
    public void handleMessage(Message msg){   
     switch(msg.what){ 
      case 0: 
       if (!isDoneThinking){ 
        editTextConfusedText.setText("Still Thinking "+new Integer(thinkSeconds).toString()); 
        thinkSeconds++; 
        this.removeMessages(0); 
        sendMessageDelayed(obtainMessage(0),1000); // <== Loop on delayed messages every second 
       } 
       else { 
        thinkSeconds= 0; // reset timer 
       } 
       break; 
      default: 
       super.handleMessage(msg); 
       break; 
     } 
    } 
}; 

우리는 onClick에서 타이머를 시작합니다. what 값이 "0"인 빈 메시지를 보내기 만하면됩니다.

타이머는 제약이 없으며 플래그 isDoneThinking이 true로 설정 될 때까지 계속 계산됩니다.

2

다른 스레드에서 GUI를 업데이트 할 수 없습니다. runOnUiThread 또는 handler을 사용하여 GUI를 업데이트 할 수 있습니다. 예를 들어

:

new Thread(new Runnable() { 
      public void run() { 
       while(true) { 
        try { 
         Thread.currentThread().sleep(100); 
         runOnUiThread(new Runnable() { 
          public void run() { 
           tv.setText("Time: " + System.currentTimeMillis()); 
          } 

        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }).start(); 

은 BTW - 그것은 정적 메서드이기 때문에 Thread.currentThread().sleep(100);의 사용은 Thread.sleep(100) 단락 될 수있다. 해당 내용은 Jon Skeet's answer입니다.

0

또는 AsyncTask을 사용하십시오. 백그라운드 작업을 수행하고 UI를 올바르게 업데이트하도록 설계되었습니다. 이런 식으로 디자인이 확장 될 것입니다.