Android中如何巧妙停止线程的方法

好长时间没更新博客了,最近听取别人的博客写作经验,将开发中遇到的问题进行分享也是原创。这是去年的网约车项目中遇到的。
在处理多线程任务时,比如倒计时接单(通过子线程实现倒计时),新来订单15s后自动消失。而业务需求中又要允许用户在倒计时未结束时手动划掉消失,则此时需要停止倒计时线程。或者可能有时有多单依次叠加,此时最上面的一单消失时,也需要先停止上一单倒计时再自动开启下一单的倒计时。
如果是new Thread方式的interrupt()方法来停止线程,你打印时输出会发现倒计时中累加的变量并未停止累加。个中原因参看停止Java线程,小心interrupt()方法
万般无奈中想起AsyncTask不是自带线程停止方法么,即taskProgress.cancel(true)(taskProgress是TaskProgress继承AsyncTask后新new的对象),并且自带判断线程是否正在执行的方法taskProgress.getStatus() == AsyncTask.Status.RUNNING,果断解决问题。代码如下:
     /*
     * 新来订单时开始计时
     */
    public static TaskProgress taskProgress;
    public void startCountdown(final int mProgress, final int maxtime) {
        if (maxtime > 0) {
            roundProgressBar.setVisibility(View.VISIBLE);

            if (taskProgress != null && taskProgress.getStatus() == AsyncTask.Status.RUNNING)  
            {  
                taskProgress.cancel(true); // 如果Task还在运行,则先取消它,然后执行关闭activity代码  
                taskProgress = null;
            }  
            taskProgress = new TaskProgress(maxtime);
            taskProgress.execute(0);

        }
    }
    /*
     * 开启倒计时,倒计时任务需要能手动停止,故而用AsyncTask,Thread无法在左右滑动卡片时停止线程
     */
    public class TaskProgress extends AsyncTask<Integer, Integer, Integer> {// 继承AsyncTask
        int maxtime;
        int mProgress;

        public TaskProgress(int maxtime) {
            this.maxtime = maxtime;
        }

        @Override
        protected Integer doInBackground(Integer... params) {// 处理后台执行的任务,在后台线程执行
            int flag = 1;
            if (isCancelled())
                return null;
            mProgress = params[0];
            while (mProgress <= maxtime && !isCancelled()) {
                try {
                    publishProgress(mProgress);//将会调用onProgressUpdate(Integer... progress)方法
                    mProgress += 1;
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                LogUtils.e("-----------------------", String.valueOf(mProgress));
                LogUtils.e("-----------------------", String.valueOf(mProgress));
                LogUtils.e("-----------------------", String.valueOf(mProgress));

            }
            return flag;
        }

        protected void onProgressUpdate(Integer... progress) {// 在调用publishProgress之后被调用,在ui线程执行
            // roundProgressBar.setProgress(progress[0]);//更新进度条的进度
            if (isCancelled()) {
                return;
            } else {
                roundProgressBar.setProgress(progress[0], maxtime);
            }
        }

        protected void onPostExecute(Integer result) {// 后台任务执行完之后被调用,在ui线程执行
            if (result != null) {
                //自动消失
                MainActivity.getInstance().vanishOnDisappear();
            } 
        }

        protected void onPreExecute() {// 在doInBackground(Params...)之前被调用,在ui线程执行
            roundProgressBar.setProgress(0, maxtime);// 进度条复位
        }

        protected void onCancelled() {// 在ui线程执行
//          roundProgressBar.setProgress(0, maxtime);// 进度条复位
        }

    }

剩下的问题时,为什么这个异步任务的线程可以通过cancel方法停止呢?未完待续……..因为我还没看源码深究@_@。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值