我对Android很新,我正在制作一个计时器应用程序(代码不完整,你可以看到,但我一次测试的东西)。再次按下开始按钮会导致应用程序关闭。我编辑了我的代码,以便在每次调用onClick时重新创建计时器,但是在第二次单击后应用程序仍然关闭。谢谢你的帮助。
package com.example.ryan.timerapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
secondsView = (TextView) findViewById(R.id.seconds);
tenSecondsView = (TextView) findViewById(R.id.tensSeconds);
hoursView = (TextView) findViewById(R.id.hours);
tenHoursView = (TextView) findViewById(R.id.tensHours);
minutesView = (TextView) findViewById(R.id.minutes);
tenMinutesView = (TextView) findViewById(R.id.tensMinutes);
timer = new Timer();
}
TextView secondsView;
TextView tenSecondsView;
TextView hoursView;
TextView tenHoursView;
TextView minutesView;
TextView tenMinutesView;
Timer timer;
TimerTask timerTask;
public void start(View view){
if(timer != null) {
timerTask.cancel();
timer.cancel();
}
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Thread(new Runnable() {
@Override
public void run() {
int secondsInt = Integer.parseInt(secondsView.getText().toString());
int tenSecondsInt = Integer.parseInt(tenSecondsView.getText().toString());
int hoursInt = Integer.parseInt(hoursView.getText().toString());
int tenHoursInt = Integer.parseInt(tenHoursView.getText().toString());
int minutesInt = Integer.parseInt(minutesView.getText().toString());
int tenMinutesInt = Integer.parseInt(tenMinutesView.getText().toString());
if (secondsInt < 9) {
secondsInt++;
secondsView.setText(secondsInt + "");
} else {
secondsInt = 0;
secondsView.setText(secondsInt + "");
if (tenSecondsInt < 6) {
tenSecondsInt++;
tenSecondsView.setText(tenSecondsInt + "");
} else {
tenSecondsInt = 0;
tenSecondsView.setText(tenSecondsInt + "");
if (minutesInt < 9) {
minutesInt++;
minutesView.setText(minutesInt + "");
} else {
minutesInt = 0;
minutesView.setText(minutesInt + "");
}
}
}
}
}));
}
};
timer.scheduleAtFixedRate(timerTask,0, 1000);
}
public void stop(View view){
timer.cancel();
}
public void reset(View view){
secondsView.setText("0");
tenSecondsView.setText("0");
minutesView.setText("0");
tenMinutesView.setText("0");
hoursView.setText("0");
tenHoursView.setText("0");
}
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.ryan.timerapp.MainActivity"
android:layout_margin="5dp"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="35sp"
android:text="Timer"
android:gravity="center"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center"
android:layout_weight="2"
>
<TextView
android:id="@+id/tensHours"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="35sp"
android:text="0"
/>
<TextView
android:id="@+id/hours"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="35sp"
android:text="0"
/>
<TextView
android:id="@+id/firstColon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="35sp"
android:text=":"
/>
<TextView
android:id="@+id/tensMinutes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="35sp"
android:text="0"
/>
<TextView
android:id="@+id/minutes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="35sp"
android:text="0"
/>
<TextView
android:id="@+id/secondColon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:text=":"
/>
<TextView
android:id="@+id/tensSeconds"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="35sp"
android:text="0"
/>
<TextView
android:id="@+id/seconds"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="35sp"
android:text="0"
/>
</LinearLayout>
<Button
android:id="@+id/startButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="START"
android:textSize="30sp"
android:onClick="start"
/>
<Button
android:id="@+id/stopButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="STOP"
android:textSize="30sp"
android:onClick="stop"
/>
<Button
android:id="@+id/resetButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:layout_weight="2"
android:text="RESET"
android:textSize="30sp"
android:onClick="reset"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>
答案 0 :(得分:0)
第一个是秒数计数器不会更新超过1秒
TimerTask
用于在指定时间运行特定任务。
timer.schedule()
并不意味着连续不断。
检查此documentation。
所以这段代码 -
int secondsInt = Integer.parseInt(txt.getText().toString());
secondsInt++;
if(secondsInt<=6) {
txt.setText(secondsInt + "");
}
只会运行一次。因此
秒数计数器不会更新超过1秒
是明显的行为。
第二次点击开始按钮会导致应用关闭
您正在尝试运行已安排的TimerTask
。
您需要创建一个新的Timer
实例,以便再次启动TimerTask
。
更改你的start()方法 -
public void start(View view){
if(timer != null) {
timerTask.cancel();
timer.cancel();
}
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Thread(new Runnable() {
@Override
public void run() {
int secondsInt = Integer.parseInt(txt.getText().toString());
secondsInt++;
if(secondsInt<=6) {
seconds.setText(secondsInt + "");
}
}
}));
}
};
timer.scheduleAtFixedRate(timerTask,0, 1000);
}
此外,无需一次又一次初始化TextView。只在onCreate()
-
private TextView seconds;
private Timer timer;
private TimerTask timerTask;
在onCreate()
seconds = (TextView) findViewById(R.id.seconds);