2010-05-27 6 views
1

간단한 타이머를 만들려고합니다.Android 용 간단한 알림

package com.anta40.reminder; 

import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.RadioGroup; 
import android.widget.TabHost; 
import android.widget.TextView; 
import android.widget.RadioGroup.OnCheckedChangeListener; 
import android.widget.TabHost.TabSpec; 

public class Reminder extends Activity{ 

    public final int TIMER_DELAY = 1000; 
    public final int TIMER_ONE_MINUTE = 60000; 
    public final int TIMER_ONE_SECOND = 1000; 
    Timer timer; 
    TimerTask task; 
    TextView tv; 

    @Override 
    public void onCreate(Bundle icicle) { 

     super.onCreate(icicle); 
     setContentView(R.layout.main); 
     timer = new Timer(); 

     task = new TimerTask() { 

      @Override 
      public void run() { 
       tv = (TextView) findViewById(R.id.textview1); 
       tv.setText("BOOM!!!!"); 
       tv.setVisibility(TextView.VISIBLE); 
       try { 
        this.wait(TIMER_DELAY); 
       } 
       catch (InterruptedException e){ 

       } 
       tv.setVisibility(TextView.INVISIBLE); 
      } 

     }; 

     TabHost tabs=(TabHost)findViewById(R.id.tabhost); 

     tabs.setup(); 

     TabSpec spec = tabs.newTabSpec("tag1"); 

     spec.setContent(R.id.tab1); 
     spec.setIndicator("Clock"); 
     tabs.addTab(spec); 

     spec=tabs.newTabSpec("tag2"); 
     spec.setContent(R.id.tab2); 
     spec.setIndicator("Settings"); 
     tabs.addTab(spec); 

     tabs.setCurrentTab(0); 

     RadioGroup rgroup = (RadioGroup) findViewById(R.id.rgroup); 
     rgroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(RadioGroup group, int checkedId) { 
       if (checkedId == R.id.om){ 
        timer.schedule(task, TIMER_DELAY, 3*TIMER_ONE_SECOND); 
       } 
       else if (checkedId == R.id.twm){ 
        timer.schedule(task, TIMER_DELAY, 6*TIMER_ONE_SECOND); 
       } 
       else if (checkedId == R.id.thm){ 
        timer.schedule(task, TIMER_DELAY, 9*TIMER_ONE_SECOND); 
       } 
      } 
     }); 

    } 
} 

라디오 버튼을 클릭 할 때마다 타이머가 시작되어야합니다. 하지만 왜 시작되지 않습니까?

답변

1

첫째, 백그라운드 스레드에서 UI를 수정할 수 없습니다. 따라서 TimerTask에서 UI를 수정할 수 없습니다.

두 번째로, "붐!" 논리가 주요 응용 프로그램 스레드에 있었기 때문에 Android에서 아무 것도 할 수 없습니다. Android의 UI는 메시지 및 이벤트 중심입니다. setText()setVisibility()으로 전화를 걸면 Android로 제어권을 반환 할 때까지 적용되지 않습니다. 따라서 TextView이 보이기 직후에 보이지 않게되므로 귀하의 경우에는 아무 것도 볼 수 없습니다.

코드를 주 응용 프로그램 스레드로 이동하는 경우 wait() 호출과 같이 해당 스레드를 차단하지 마십시오.

+0

>> 컨트롤을 안드로이드에 반환하기 전까지는 효과가 없습니다. 어떻게 돌려 줄 수 있습니까? >> 세 번째, 코드를 주 응용 프로그램 스레드로 옮기면 wait() 호출과 같이 해당 스레드를 차단하지 마십시오. 주어진 간격 후에 텍스트보기 "붐"을 보이지 않게하고 싶습니다. 그러므로 wait(). 나는 지금 더 나은 해결책을 모른다. – anta40

+0

"그럼 어떻게 돌려 줄 수 있니?" 돌아 오는 (즉, 현재있는 콜백을 종료). "일정 기간이 지나면 텍스트 뷰"붐 "이 보이지 않게되기를 기다리고 있습니다. 따라서 잠시 기다려주십시오. 지금은 더 나은 해결책을 모릅니다." View 나 Handler에서'postDelayed()'를 사용하여 원하는 지연 시간 후에'Runnable'을 실행하도록 스케쥴하고,'Runnable'의'run()'메소드에서'TextView'를 보이지 않게하십시오. – CommonsWare