Android怎么利用AsyncTask类实现类似秒表暂停功能?
以下是我的源码,我只实现了开始计时和结束计时,但不知道怎么用暂停按钮和继续按钮来暂停及时和恢复计时。我试过在setOnClickListener用asyTask.wait(),但一点击线程就终止了,退出界面了。public class MainActivity extends AppCompatActivity {
private Button startButton;//开启按钮
private Button stopButton;//停止按钮
private Button pauseButton;
private Button continueButton;
private TextView showValue;//显示数值控件
private MyAsyTask asyTask;//异步任务
public static Handler myHandler;//定义一个static类型的Handler
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startButton = findViewById(R.id.start);
stopButton = findViewById(R.id.stop);
pauseButton=findViewById(R.id.pause);
continueButton=findViewById(R.id.conti);
showValue = findViewById(R.id.count);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//一个任务只能执行一次,因此每次点击将开启一个新任务
Integer[] startEnd = {1, 10}; //从1输出到10
asyTask = new MyAsyTask();
asyTask.execute(startEnd);//启动任务
}
});
pauseButton.setOnClickListener(new View.OnClickListener() {
@Override
public voidonClick(View v) {
}
});
continueButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
stopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
asyTask.cancel(true);//撤销任务
}
});
}
class MyAsyTask extends AsyncTask<Integer, Integer, Void> {
//对应Params, Progress, Result,均为泛型
//该方法由主线程执行,一般用来执行初始化工作
@Override
protected void onPreExecute() {
super.onPreExecute();
//让开始按钮不能被点击
startButton.setEnabled(false);
}
//该方法由开启的子线程执行,是后台功能的主体
//其参数类型由AsyncTask类的第一个泛型参数指定
//其返回值类型由AsyncTask类的第三个泛型参数指定,
//并作为onPostExecute方法的参数
@Override
protected Void doInBackground(Integer... params) {
int i = params[0];
int end = params[1];
try {
while (!isCancelled() && i <= end) {
publishProgress(i);
i++;
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
//该方法由主线程执行,
// 一般是doInBackground通过publishProgress方法间接调用
//其参数由AsyncTask类的第二个泛型参数指定
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
showValue.setText("当前已经运行" + values[0] + "秒");
}
//该方法由主线程调用,一般用于最后收尾工作。
//其参数类型由AsyncTask类的第三个泛型参数指定
//其值为doInBackground方法的返回值
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
startButton.setEnabled(true);
}
//该方法由主线程调用
//cancel方法被调用时,该方法将会被调用,
//而onPostExecute方法将不再被调用。
@Override
protected void onCancelled() {
super.onCancelled();
startButton.setEnabled(true);
}
}
} 暂停就直接把当前的秒数存储,恢复就再从存储的那个秒数开始记不就行了? 或者直接Thread.sleep(Integer.MAX)也相当于暂停了,恢复的时候Thread.notify() {:1_908:}额。。。这是说实现时间暂停吗? anna_miracle 发表于 2021-1-9 22:30
暂停就直接把当前的秒数存储,恢复就再从存储的那个秒数开始记不就行了?
秒数是个局部变量,要在pauseButton.setOnClickListener(new View.OnClickListener() {
@Override
public voidonClick(View v) {
}
});控制,这个没办法实现。
anna_miracle 发表于 2021-1-9 22:33
或者直接Thread.sleep(Integer.MAX)也相当于暂停了,恢复的时候Thread.notify()
其实我对这个类并不是很懂。在pauseButton的监听方法里,不能用Thread,用asyTask.wait()直接退出程序了。 腾空而飞 发表于 2021-1-10 00:47
额。。。这是说实现时间暂停吗?
是的,用pauseButton实现暂停,用continueButton实现恢复。
页:
[1]