2011-05-02 3 views
0

간단한 응용 프로그램을 만드는 중입니다. 응용 프로그램은 대화 상자를 표시하고 백그라운드에서 타이머를 실행해야합니다. 타이머가 경과하면 경고음이 재생됩니다. 그러나 타이머 전에 대화 상자를 클릭하면 타이머를 취소해야합니다. 나는이 코드로 지금까지 뭘했는지 게시하고 있는데, 삐 소리가 먼저 나고 대화 상자가 뜨고 타이머가 끝난 주 스레드에 어떻게 말할까요?메인 스레드에 어떻게 응답합니까?

공용 클래스 메인은 확장 활동 {

static final int DIALOG_ADDPLAYERS = 0; 

Thread backgroundThread; 
TextView myText; 
myCounter counter; 
MediaPlayer mp; 

Handler handler = new Handler(){ 

    @Override 
    public void handleMessage(Message msg) 
    { 
      playAudio(); 
    } 

}; 

protected Dialog onCreateDialog(int id) 
    { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 

     switch(id) 
     { 
     case 0: 

       builder.setTitle("Restart Game"); 
       builder.setMessage("Are you sure to restart the game?"); 
       builder.setPositiveButton("YES", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) 
        { 
         counter.cancel(); 
        }}); 
       builder.setNegativeButton("NO", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) 
        { 
         counter.cancel(); 
        } 
       }); 


      break; 


     default: 
     } 
     return builder.create();  
    } 

void playAudio() 
{ 
    mp = MediaPlayer.create(this, R.raw.beep); 
    mp.setLooping(false); 
    mp.start(); 
    mp.setOnCompletionListener(new OnCompletionListener(){ 
     public void onCompletion(MediaPlayer arg0) 
     { 
      finish(); 
     } 
    }); 
    mp.setOnCompletionListener(new OnCompletionListener(){ 
     public void onCompletion(MediaPlayer arg0) 
     { 
      finish(); 
     }}); 

} 

@Override 
protected void onDestroy() 
{ 
    super.onDestroy(); 
    if (mp!=null) 
    { 
     mp.release(); 
     mp=null; 
    } 
} 



/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    myText = (TextView)findViewById(R.id.mytext); 

    //Toast.makeText(this, "onCreate()", Toast.LENGTH_LONG).show();  
    showDialog(0); 
    startMyTimer(); 
} 




protected void startMyTimer() 
{  
    counter = new myCounter((long)10000,(long)1000); 
    backgroundThread = new Thread(new Runnable(){ 

     @Override 
     public void run() 
     {  
       try 
       { 
        //Thread.sleep(10000); 


        counter.startTimer(); 

       } 
       catch (Exception e) { 

        e.printStackTrace(); 
       } 


     } 

    }); 
    backgroundThread.start(); 
} 

}

이 내 MyCounter 클래스입니다 :

package com.androidbook.bgthread; 

import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.CountDownTimer; 

public class myCounter extends CountDownTimer 
{ 
    public myCounter(long millisInFuture, long countDownInterval) 
    { 
     super(millisInFuture, countDownInterval); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onFinish() 
    { 

    } 

    @Override 
    public void onTick(long millisUntilFinished) 
    { 


    } 

    public void startTimer() 
    { 
     start(); 
    } 

} 

이 그것을 할 수있는 올바른 방법인가? 도와주세요.

답변

1

처리기 : http://developer.android.com/reference/android/os/Handler.html을 사용하십시오. 이렇게하면 다른 스레드에서 주 스레드로 메시지를 보낼 수 있습니다.

도움이되는 참조 http://www.tutorialforandroid.com/2009/01/using-handler-in-android.html 내가 명시 적으로 카운트 다운 타이머를 사용할 필요 없다

+0

에있다? Alsi 시간이 다되면 신호음을 울려 야합니다. 어떻게해야합니까? – Madz

+0

카운트 다운 타이머를 사용할 수 있습니다. 삐 소리가 나지 않는 한, 결코 시도하지 마십시오. – Femi

관련 문제