android 列表倒计时流畅的完美实现

本博客由gengqiquan原创,转载请注明出处http://blog.csdn.net/gengqiquan/article/details/50541007,尊重他人的技术劳动成果,谢谢

最近宣传自己新写的一个APP的时候,好多开发朋友都在询问我首页的列表倒计时如何实现的,看起来很流畅啊!可见大家被倒计时坑的还是比较多的。
这里写图片描述
本篇博客的方案是参考了网上众多方案后,取精华精简的一套方案,废话止步,上代码。就一个类

import java.util.Date;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;

import com.qbs.itrytryc.R;

public class TimeTextView extends TextView {
SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        // 在控件被销毁时移除消息
        handler.removeMessages(0);
    }

    long Time;
    private boolean run = true; // 是否启动了
    @SuppressLint("NewApi")
    private Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 0:
                if (run) {
                    long mTime = Time;
                    if (mTime > 0) {
                        String day = "";
                            TimeTextView.this.setText("倒计时    还有" + Time+"s");
                            Time = Time - 1000;
                            handler.sendEmptyMessageDelayed(0, 1000);
                        }
                    } else {
                        TimeTextView.this.setVisibility(View.GONE);
                    }

                }
                break;
            }
        }
    };


    public TimeTextView(Context context) {
        super(context);
    };

    public TimeTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TimeTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @SuppressLint("NewApi")
    public void setTimes(long mT) {
        // 标示已经启动
        Date date = new Date();
        long t2 = date.getTime();
        Time = mT - t2;
        date = null;

        if (Time > 0) {
            handler.removeMessages(0);
            handler.sendEmptyMessage(0);
        } else {
            TimeTextView.this.setVisibility(View.GONE);
        }
    }

    public void stop() {
        run = false;
    }
}

整个类就这么多代码了,核心就是内部handler加使用主线程的looper。由于是在主线程的,可以很好的解决页面显示混乱的问题,更新UI本来就是要在主线程的,同时做的事情也必须少而精简。
litview的grtview()里面调用的代码也就一句textView.setTimes( new Date().getTime());

我建了一个QQ群(群号:121606151),用于大家讨论交流Android技术问题,有兴趣的可以加下,大家一起进步。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值