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