안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요~ 안드로이드 초보입니다.
고수님들의 가르침을 받고자 이렇게 질문을 드립니다.
C++ 쪼금 아는 수준입니다. ^^; 어플 하나 만들어 보려는데 잘 안되는군요. ㅡㅡ
우선 테스트 수준으로 하나 만들어 봤습니다.
전역변수 사용하여, TextView에 3초간격으로 문자열 변경 하려 합니다.
클래스는 다음과 같습니다.
Singleton.java
public class Singleton {
final String tag = "My_Singleton";
private static Singleton instance;
private Singleton() {}
//.//전역으로 사용할 변수
public int nNowIdx = 0;
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
다음은 Activity 상속받은 클래스 입니다.
MyClass.java
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MyClass extends Activity {
Singleton MyApplication = Singleton.getInstance();
final String sPause = "Pause";
Button btn_Pause = null;
TextView tv = null;
TimerTask task = null;
Timer timer = null;
TextView t1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Use a custom layout file
setContentView(R.layout.myclass);
t1 = (TextView)findViewById(R.id.TextView01);
btn_Pause = (Button)findViewById(R.id.Btn_Pause);
tv = (TextView)findViewById(R.id.Btn_Pause);
btn_Pause.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(sPause.equals(tv.getText())) {
timer.cancel();
tv.setText("Resume");
t1.setText("잘 바뀌어요.");
}
else {
timer.schedule(task, 0, 3000); // <- 여기서 오류나요.
tv.setText("Pause");
}
}
});
setWord();
//.//
task = new TimerTask() {
public void run() {
My_Run();
}
};
timer = new Timer();
timer.schedule(task, 0, 3000);
//.//
}
@Override
protected void onPause() {
timer.cancel();
super.onPause();
}
public void My_Run() {
if(5 == (MyApplication.nNowIdx + 1)) {
timer.cancel();
return;
}
t1.setText(new Integer(MyApplication.nNowIdx).toString());
MyApplication.nNowIdx++;
}
}어플 시작하면, 3초에 한번씩 nNowIdx를 t1을 카운트로 변경하고, 0,1,2,3,4를 모두 수행하면 타이머 캔슬,
중간에 Pause 버튼 누르면, 타이머 캔슬, 버튼 Resume로 변경, 다시 버튼 누르면 타이머 실행...
여기에서, 3가지 궁금한것이 있습니다.
1. 처음 실행시... My_Run() 함수를 3초에 한번씩 잘 들어가는것 같은데요, Log로 찍어보면, nNowIdx가 잘 증가하지 않는것 같습니다.
0, 0, 0, 1, 2, 3... 식으로 3초에 한번씩 로그에 찍히더라구요.
2. Pause 버튼 누르고, 다시 Resume 할때 타이머 스케쥴을 부르면 안되나요?
어떤식으로 다시 불러야 해요? 쓰레드처럼 Resume() 같은 기능은 없나요?
3. Pause 버튼 눌렀을땐, t1 이 잘 변하는데, My_Run()에서 t1 변경하는것은 왜 안돼죠?
회원님... 부탁드립니다. ^^;
2010.05.04 15:15:01
보니까 My_Run에서 t1에 접근하고 계시네요 안드로이드의 UI는 단일스레드 모델이기때문에 Timer같이 다른스레드를 만들어 실행하는 것에서 UI에 접근할 수 없어요 그래서 Handler를 쓰는데요
http://www.androidpub.com/57470
http://developer.android.com/resources/articles/timed-ui-updates.html
링크해드린 글들을 참고해보세요



