2012-01-31 2 views
0

저는 Android 용 간단한 Workout Timer를 만들려고합니다. 사용자는 총 지속 시간, 총 휴식 시간 등의 정보가 포함 된 WorkoutPlan을 만듭니다. 앱은 매 초마다 업데이트하는 타이머를 표시합니다. 등 안드로이드 타이머 앱을 쓰레드로 구성하는 방법은 무엇입니까?

예쁜 시작하는 간단하지만 나뿐만 제대로 즉 우려, 올바른 기술, 반응 UI, 정확합니다 타이머를 보장 분리 가능한 응용 프로그램을 구축하기 위해 노력하고있어

,

여기입니다 내가 지금까지 무엇을의 단순화 :

WorkoutPlan, 사용자가 /로드 타이머

public class WorkoutPlan { 
    public long duration; 
} 

TimerThread에 다른 운동 계획을 절약 할 수 있습니다,이 클래스가 Runnable 구현이 걸릴 생성자의 WorkoutPlan에있는 시작/중지는 경과 된 시간을 표시합니다.

public class TimerThread implements Runnable { 
    public boolean running = false; 

    private long lastStartTime; 
    private long savedTime; 
    private WorkoutPlan plan; 
    private Handler handler; 

    public TimerThread(WorkoutPlan p, Handler h) { 
     plan = p; 
     handler = h; 
    } 

    public synchronized void start() { 
     lastStartTime = System.currentTimeMillis(); 
     running = true; 
    } 

    public synchronized void pause() { 
     savedTime = elapsedTime(); 
     lastStartTime = 0; 
     running = false; 
    } 

    public synchronized long elapsedTime() { 
     if (lastStartTime == 0) { 
      return savedTime; 
     } else { 
      return savedTime + (System.currentTimeMillis() - lastStartTime); 
     } 
    } 

    public synchronized String currTimeStr() { 
     //format elapsed time in seconds to hh:mm:ss format 
     long elapsed = elapsedTime()/1000; 
     long h = elapsed/3600; 
     long m = (elapsed % 3600)/60; 
     long s = elapsed % 60; 

     if (h > 0) { 
      return String.format("%02d:%02d:%02d", h, m, s); 
     } else { 
      return String.format("%02d:%02d", m, s); 
     } 
    } 

    @Override 
    public void run() { 
     while (running) { 
      try { 
       handler.sendMessage(handler.obtainMessage()); 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

TimerView,

public class TimerView extends View { 
    private final Paint mBg; 
    private final Paint mText; 
    private WorkoutPlan plan; 
    private TimerThread timer; 
    private Thread thread; 
    private Handler handler = new TimerHandler(); 

    public TimerView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     plan = new WorkoutPlan(); 

     timer = new TimerThread(plan, handler);   
     thread = new Thread(timer); 

     mBg = new Paint(); 
     mBg.setColor(getResources().getColor(R.color.bg_default)); 
     mText = new Paint(); 
     mText.setColor(getResources().getColor(R.color.text)); 
    } 

    public void start() { 
     timer.start(); 
     thread.start(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     //draw current time and current round 
     canvas.drawText(timer.currTimeStr(), 0, 50, mText); 
    } 

    private class TimerHandler extends Handler { 

     @Override 
     public void handleMessage(Message msg) { 
      super.handleMessage(msg); 
      invalidate(); 
     }   
    } 
} 

마지막 WorkoutTimer을 경과 시간을 표시하는 사용자 정의보기,

public class WorkoutTimer extends Activity { 
    private TimerView mTimer; 

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

     mTimer = (TimerView) findViewById(R.id.timer_view); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart();   
     mTimer.start(); 
    } 
} 

몇 가지 질문을 시작합니다 활동 :

  1. WorkoutPlan 개체를 만드는 가장 좋은 곳은 어디입니까? 현재는 TimerView입니다. 대신 WorkoutTimer 활동에서 완료해야합니까? 예인 경우 WorkoutPlan 개체를 TimerView에 전달하려면 어떻게해야하나요?
  2. 앱이 처음에는 제대로 작동하지만 홈 화면으로 돌아가서 다시 앱으로 돌아올 때 충돌이 발생합니다. 무엇이 충돌을 일으키는가? 그것은 theading입니까?
  3. 현재 새 ThreadHandler을 사용하고 있습니다. 이게 괜찮은가요 아니면 TimerTask이 더 나아질까요? 스레드를 시작하기에 가장 좋은 곳은 어디입니까?
  4. 모든 스레딩 코드를 TimerView에 넣으시겠습니까? 그들이 다른 곳에 있어야하는 것처럼 느껴집니다.
  5. TimerThread의 모든 메소드에 동기화를 추가 할 수 있습니까?
  6. 연습을 위해 할 수있는 것처럼이 앱을 제대로 만들려고합니다. 제가해야 할 기술이 향상되었거나 제가 잘못하고있는 부분이 있다면 알려주십시오.

답변

0

스타일을 요구하는 경우, 매우 나쁜 스타일은 Timer가 아니라 다른 유형의 Handler 구현을 위해 일부 변형에서 "timer"단어를 사용하는 것입니다. 다른 이름을 사용하십시오. 이제 코드는 거의 읽을 수 없습니다.

관련 문제