2011-05-07 3 views
0

나 자신을위한 타이머 애플리케이션을 만드는 동안 Android와 java를 배우고 있습니다.
이전 스레드 참조하기 Android - Controlling a task with Timer and TimerTask? 타이머를 카운트 다운하기위한 Runnable 메소드를 생성하려고합니다.
내가 붙어있는 기본적인 자바 문제는 무엇을 클래스에 postDelayed() 호출을 첨부합니까?새 개발자 - 타이머 구현과 관련된 기본 Java 질문

내 활동은 지금 TimerButtons라고, 나는이 일 것이라고 생각 : 방법 postDelayed (새의 Runnable() {}, INT가) 유형에 대한 정의되지 않은 :

package com.TimerButtons; import android.app.Activity; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class TimerButtons extends Activity { private TextView mDisplayTime; private Button mButtonStart; private Button mButtonStop; private int timeTenths = 0; private Drawable d; private PorterDuffColorFilter filter; // capture our View elements @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); filter = new PorterDuffColorFilter(Color.DKGRAY, PorterDuff.Mode.SRC_ATOP); d = findViewById(R.id.buttonStart).getBackground(); d.setColorFilter(filter); d = findViewById(R.id.buttonStop).getBackground(); d.setColorFilter(filter); mDisplayTime = (TextView) findViewById(R.id.displayTime); mButtonStart = (Button) findViewById(R.id.buttonStart); mButtonStop = (Button) findViewById(R.id.buttonStop); // add click listeners to the buttons mButtonStart.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { new Thread(r).start(); } }); mButtonStop.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { timeTenths = 0; updateDisplay(); updateSetting(); } }); // display the current time updateDisplay(); } // runtime methods below here // updates the time we display in the TextView private void updateDisplay() { mDisplayTime.setText( String.valueOf(((float)timeTenths)/10) ); } private void updateSetting() { mTensDigit.setText(String.valueOf(timeTenths/100)); mOnesDigit.setText(String.valueOf((timeTenths%100)/10)); mTenthsDigit.setText(String.valueOf(timeTenths%10)); } Runnable r = new Runnable() { public void run() { if (timeTenths >= 1) { timeTenths -= 1; if (timeTenths != 0) mDisplayTime.postDelayed(this, 100); updateDisplay(); } } }; } 

내가 오류 TimerButtons
주석 처리 된 행에 있습니다.

아무쪼록 안내해 주셔서 감사합니다!
Dave

+0

TimerButtons이란 무엇입니까 ?? – Varun

+0

TimerButtons 내 응용 프로그램의 활동입니다 - 최상위 ... – DBell

답변

0

TimerButton이 귀하의 활동 인 경우 제대로 작동해야합니다. 이 시도 : (후세에)

TimerButtons.this.postDelayed(this, 1000); 

편집 : postDelayedView 아닌 Context에 정의 : 내가 처음에 잘못이었다. 사용

mDisplayTime.postDelayed(this, 1000); 
+0

그냥 시도했지만, 같은 오류가 발생했습니다. 이전 스레드는 처리기를 만드는 것에 대해 이야기했지만, 나는 거기에서 잃어 버렸습니다. – DBell

+0

주변 방법을 보여주는 코드 샘플을 작성하십시오. 작동하지 않는 경우 정확히 무슨 일이 일어나는지 말하기 어렵습니다. – Femi

+0

전체 코드를 게시하기 싫어하십시오. 어쩌면이 도움이 될 것입니다 : 내가 원래 게시 한 코드는 전체 메서드입니다. 마지막 하나는 onCreate 블록의 끝 (외부)에서 만들어졌습니다. Dave – DBell

0

당신의 작업을 완료하려면 handler 클래스가 있다고 생각합니다.

당신은 그것을 다르게 ...

난 당신이 하나의 구현 정말이 클래스로 할 수 있지만 모르는 접근 방식을 가지고있다.

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Locale; 
import java.util.TimeZone; 
import java.util.concurrent.TimeUnit; 

import com.skens.sms.R; 

import android.app.Activity; 
import android.graphics.Color; 
import android.graphics.PorterDuff; 
import android.graphics.PorterDuffColorFilter; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.SystemClock; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class TimerButtons extends Activity { 

    private TextView mDisplayTime; 

    private Button mButtonStart; 
    private Button mButtonStop; 

    //private int timeTenths = 0; 

    private Drawable d; 
    private PorterDuffColorFilter filter; 

    private TinyTimer myTimer; 

    // capture our View elements 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     filter = new PorterDuffColorFilter(Color.DKGRAY, PorterDuff.Mode.SRC_ATOP); 

     d = findViewById(R.id.buttonStart).getBackground(); d.setColorFilter(filter); 
     d = findViewById(R.id.buttonStop).getBackground(); d.setColorFilter(filter); 

     mDisplayTime = (TextView) findViewById(R.id.displayTime); 

     mButtonStart = (Button) findViewById(R.id.buttonStart); 
     mButtonStop = (Button) findViewById(R.id.buttonStop); 



     // add click listeners to the buttons 
     mButtonStart.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       //new Thread(r).start(); 
       myTimer.startTimer(1000, mDisplayTime, mTensDigit, mOnesDigit, mTenthsDigit); 
      } 
     }); 

     mButtonStop.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       //timeTenths = 0; 
       //updateDisplay(); 
       updateSetting(); 
      } 
     }); 

     myTimer = new TinyTimer(); 

     // display the current time 
     //updateDisplay(); 

    } 

    // runtime methods below here 
    // updates the time we display in the TextView 
    private void updateDisplay() { 
     //mDisplayTime.setText(
     //  String.valueOf(((float)timeTenths)/10) 
     //); 
    } 

    private void updateSetting() { 
     //mTensDigit.setText(String.valueOf(timeTenths/100)); 
     //mOnesDigit.setText(String.valueOf((timeTenths%100)/10)); 
     //mTenthsDigit.setText(String.valueOf(timeTenths%10)); 


    } 

    //Runnable r = new Runnable() 
    //{ 
    // public void run() 
    // { 
    //  if (timeTenths >= 1) 
    //  { 
    //   timeTenths -= 1; 
    //   if (timeTenths != 0) 
    //    mDisplayTime.postDelayed(this, 100); 
    //   updateDisplay(); 
    //  } 
    // } 
    //}; 


    public class TinyTimer { 

     private Handler _handler; 

     private long _startTime = 0; 
     private long _millis; 

     private long _delayMillis; 

     private TextView mDisplayTime; 
     private TextView mTensDigit; 
     private TextView mOnesDigit; 
     private TextView mTenthsDigit; 

     private String _format = String.format("%%0%dd", 2); 

     private int timeTenths = 0; 

     public TinyTimer(){ 
      _handler = new Handler(); 
     } 

     public void startTimer 
     (long delayMillis,TextView DisplayTime, TextView TensDigit, TextView OnesDigit, TextView TenthsDigit){ 
      mDisplayTime = (TextView) DisplayTime; 
      mTensDigit = (TextView) TensDigit; 
      mOnesDigit = (TextView) OnesDigit; 
      mTenthsDigit = (TextView) TenthsDigit; 

      _delayMillis = delayMillis; 
      _startTime = SystemClock.elapsedRealtime(); 
      _handler.removeCallbacks(updateTimerTask); 

      updateTimerTask.run(); 
     } 

     public void stopTimer(){ 
      _handler.removeCallbacks(updateTimerTask); 
     } 

     public void pauseTimer(){ 
      _handler.removeCallbacks(updateTimerTask); 
     } 

     public void unpauseTimer(){ 
      if(_startTime != 0){ 
       updateTimerTask.run();   
      } 
     } 

     private Runnable updateTimerTask = new Runnable() { 

      @Override 
      public void run() { 
       final long start = _startTime; 
       _millis = SystemClock.elapsedRealtime() - start; 


       if (timeTenths >= 1) 
       { 
        timeTenths -= 1; 
        if (timeTenths != 0) 
         mDisplayTime.postDelayed(this, 100); 

        mDisplayTime.setText(String.valueOf(((float)timeTenths)/10)); 
        mTensDigit.setText(String.valueOf(timeTenths/100)); 
        mOnesDigit.setText(String.valueOf((timeTenths%100)/10)); 
        mTenthsDigit.setText(String.valueOf(timeTenths%10)); 
       } 
       _handler.postDelayed(updateTimerTask, _delayMillis); 
      } 
     }; 

     public long getElapsedtime(){ 
      return _millis; 
     } 

     public String getMillis(){ 
      return String.format(_format, _millis % 1000); 
     } 


} 

구현 된 클래스는 개념 일뿐입니다. 나는 테스트하지는 않았지만 클래스를 컴파일했습니다.