吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1537|回复: 6
收起左侧

[求助] Android怎么利用AsyncTask类实现类似秒表暂停功能?

[复制链接]
mymoon 发表于 2021-1-9 21:12
以下是我的源码,我只实现了开始计时和结束计时,但不知道怎么用暂停按钮和继续按钮来暂停及时和恢复计时。我试过在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 void  onClick(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
 楼主| mymoon 发表于 2021-1-10 11:10
anna_miracle 发表于 2021-1-9 22:30
暂停就直接把当前的秒数存储,恢复就再从存储的那个秒数开始记不就行了?

秒数是个局部变量,要在pauseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void  onClick(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实现恢复。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 04:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表