mymoon 发表于 2021-1-9 21:12

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);
            }
      }
}

anna_miracle 发表于 2021-1-9 22:30

暂停就直接把当前的秒数存储,恢复就再从存储的那个秒数开始记不就行了?

anna_miracle 发表于 2021-1-9 22:33

或者直接Thread.sleep(Integer.MAX)也相当于暂停了,恢复的时候Thread.notify()

腾空而飞 发表于 2021-1-10 00:47

{:1_908:}额。。。这是说实现时间暂停吗?

mymoon 发表于 2021-1-10 11:10

anna_miracle 发表于 2021-1-9 22:30
暂停就直接把当前的秒数存储,恢复就再从存储的那个秒数开始记不就行了?

秒数是个局部变量,要在pauseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public voidonClick(View v) {
            }
      });控制,这个没办法实现。

mymoon 发表于 2021-1-10 11:12

anna_miracle 发表于 2021-1-9 22:33
或者直接Thread.sleep(Integer.MAX)也相当于暂停了,恢复的时候Thread.notify()

其实我对这个类并不是很懂。在pauseButton的监听方法里,不能用Thread,用asyTask.wait()直接退出程序了。

mymoon 发表于 2021-1-10 11:13

腾空而飞 发表于 2021-1-10 00:47
额。。。这是说实现时间暂停吗?

是的,用pauseButton实现暂停,用continueButton实现恢复。
页: [1]
查看完整版本: Android怎么利用AsyncTask类实现类似秒表暂停功能?