本博客由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技术问题,有兴趣的可以加下,大家一起进步。