Android 发送验证码 简易代码
利用Timer实现倒计时
@BindView(R.id.send) Button send;//发送验证码private int time = 60;//倒计时private Timer timer;private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {switch (msg.what) {case 1:send.setText(time + "S");break;case 2:send.setEnabled(true);send.setText("重新发送");break;}}};@OnClick({R.id.send, R.id.next})public void onClickIv(View v) {switch (v.getId()) {case R.id.send:send.setEnabled(false);getVerificationCode();break;}}//定时器private void setTimer() {timer = new Timer();TimerTask task = new TimerTask() {@Overridepublic void run() {time--;if (time > 0) handler.sendEmptyMessage(1);else {handler.sendEmptyMessage(2);destoryTimer();}}};timer.schedule(task, 0, 1000);}private void destoryTimer() {if (timer != null) {timer.cancel();timer = null;}}@Overrideprotected void onDestroy() {super.onDestroy();destoryTimer();}
TimerTask task = new TimerTask() {@Overridepublic void run() {runOnUiThread(new Runnable() {@Overridepublic void run() {time--;if (time > 0) send.setText(time + "S");else {send.setEnabled(true);send.setText("重新发送");destoryTimer();}}});}};
利用Handler实现倒计时
handler.sendMessageDelayed(handler.obtainMessage(1), 1000);final Handler handler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case 1:time--;if (time > 0) {send.setText(time + "S");handler.sendMessageDelayed(handler.obtainMessage(1), 1000);} else {send.setEnabled(true);send.setText("重新发送");}}}};
Handler handler = new Handler();handler.postDelayed(runnable, 1000);Runnable runnable = new Runnable() {@Overridepublic void run() {time--;if (time > 0) {send.setText(time + "S");handler.postDelayed(this, 1000);} else {send.setEnabled(true);send.setText("重新发送");}}};
利用CountDownTimer实现
CountDownTimer timer = new CountDownTimer(60000, 1000) {@Overridepublic void onTick(long millisUntilFinished) {send.setText(time + "S");}@Overridepublic void onFinish() {send.setEnabled(true);send.setText("重新发送");}};
GitHub上星星最多的倒计时控件
compile 'com.github.iwgang:countdownview:2.1.3'
<cn.iwgang.countdownview.CountdownViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"/>
CountdownView mCountdownView = (CountdownView)findViewById(R.id.countdownView);mCountdownView.start(995550000); // 毫秒// 或者自己编写倒计时逻辑,然后调用updateShow来更新UIfor (int time=0; time<1000; time++) {mCountdownView.updateShow(time);}
mCountdownView.dynamicShow(DynamicConfig dynamicConfig)
倒计时结束后回调
mCountdownView.setOnCountdownEndListener(OnCountdownEndListener);
指定间隔时间回调
mCountdownView.setOnCountdownIntervalListener(long, OnCountdownIntervalListener);
RecyclerView中倒计时方案1【最简单】
//定时器,用于刷新GridView的数据源private void setQryTimer() {cancelQryTimer();qryTimer = new Timer();qryTimer.schedule(new TimerTask() {@Overridepublic void run() {runOnUiThread(new Runnable() {public void run() {if (fixRpList != null && fixRpList.size() > 0) {for (FixRpBean item : fixRpList) {if (item.diff_time >= 0) item.diff_time = item.diff_time - 1000L;}if (fixRpDialog != null) fixRpDialog.upDate(fixRpList);}}});}}, 0, 1000);}
public void upDate(List<FixRpBean> redPacketList) {list.clear();list.addAll(redPacketList);mRecyclerView.getAdapter().notifyDataSetChanged();//建议使用RecyclerView的局部刷新功能}
RecyclerView中倒计时方案2【推荐】
/*** 复用 本地的计时器 —— System.currentTimeMillis(), 不必自行计时*/public class RecyclerViewActivity extends Activity {private List<ItemInfo> mDataList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_recyclerview);initData();RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rv);recyclerView.setAdapter(new MyAdapter(this, mDataList));recyclerView.setLayoutManager(new LinearLayoutManager(this));recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));recyclerView.setItemAnimator(new DefaultItemAnimator());}private void initData() {mDataList = new ArrayList<>();for (int i = 1; i < 20; i++) {mDataList.add(new ItemInfo(i * 20 * 1000));}// 校对倒计时long curTime = System.currentTimeMillis();for (ItemInfo itemInfo : mDataList) {itemInfo.endTime = curTime + itemInfo.countdown;}}static class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {private Context mContext;private List<ItemInfo> mDatas;public MyAdapter(Context context, List<ItemInfo> datas) {this.mContext = context;this.mDatas = datas;}@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {return new MyViewHolder(LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false));}@Overridepublic void onBindViewHolder(MyViewHolder holder, int position) {holder.bindData(mDatas.get(holder.getAdapterPosition()));}@Overridepublic int getItemCount() {return mDatas.size();}//**************************************************关键代码****************************************@Overridepublic void onViewAttachedToWindow(MyViewHolder holder) {super.onViewAttachedToWindow(holder);//父类中为空代码holder.refreshTime(mDatas.get(holder.getAdapterPosition()).endTime - System.currentTimeMillis());}@Overridepublic void onViewDetachedFromWindow(MyViewHolder holder) {super.onViewDetachedFromWindow(holder);holder.countdownView.stop();}//**************************************************关键代码****************************************}static class MyViewHolder extends RecyclerView.ViewHolder {public CountdownView countdownView;public MyViewHolder(View itemView) {super(itemView);countdownView = (CountdownView) itemView.findViewById(R.id.countdownView);}public void bindData(ItemInfo itemInfo) {refreshTime(itemInfo.endTime - System.currentTimeMillis());}public void refreshTime(long leftTime) {if (leftTime > 0) {countdownView.start(leftTime);} else {countdownView.stop();//停止计时器,mCustomCountDownTimer.stop();countdownView.allShowZero();//所有计时清零,即mCountdown.setTimes(0, 0, 0, 0, 0);}}}static class ItemInfo {public long countdown;/*根据服务器返回的countdown换算成手机对应的开奖时间 (毫秒)[正常情况最好由服务器返回countdown字段,然后客户端再校对成该手机对应的时间,不然误差很大]*/public long endTime;public ItemInfo(long countdown) {this.countdown = countdown;}}}
RecyclerView中倒计时方案3【最麻烦】
/*自己维护倒计时任何,再调用countdownView.updateShow来刷新显示*/public class RecyclerViewActivity2 extends AppCompatActivity {private MyAdapter mMyAdapter;private List<ItemInfo> mDataList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_recyclerview);initData();RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rv);mMyAdapter = new RecyclerViewActivity2.MyAdapter(this, mDataList);recyclerView.setAdapter(mMyAdapter);recyclerView.setLayoutManager(new LinearLayoutManager(this));recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));recyclerView.setItemAnimator(new DefaultItemAnimator());}private void initData() {mDataList = new ArrayList<>();for (int i = 1; i < 20; i++) {mDataList.add(new ItemInfo(1000 + i, "RecyclerView_测试标题_" + i, i * 20 * 1000));}// 校对倒计时long curTime = System.currentTimeMillis();for (ItemInfo itemInfo : mDataList) {itemInfo.setEndTime(curTime + itemInfo.getCountdown());}}@Overrideprotected void onResume() {super.onResume();if (null != mMyAdapter)mMyAdapter.startRefreshTime();}@Overrideprotected void onPause() {super.onPause();if (null != mMyAdapter)mMyAdapter.cancelRefreshTime();}@Overridepublic void onDestroy() {super.onDestroy();if (null != mMyAdapter)mMyAdapter.cancelRefreshTime();}static class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {private Context mContext;private List<ItemInfo> mDatas;private final SparseArray<MyViewHolder> mCountdownVHList;private Handler mHandler = new Handler();private Timer mTimer;private boolean isCancel = true;public MyAdapter(Context context, List<ItemInfo> datas) {this.mContext = context;this.mDatas = datas;mCountdownVHList = new SparseArray<>();startRefreshTime();}public void startRefreshTime() {if (!isCancel) return;if (null != mTimer) mTimer.cancel();isCancel = false;mTimer = new Timer();mTimer.schedule(new TimerTask() {@Overridepublic void run() {mHandler.post(mRefreshTimeRunnable);}}, 0, 10);}public void cancelRefreshTime() {isCancel = true;if (null != mTimer) {mTimer.cancel();}mHandler.removeCallbacks(mRefreshTimeRunnable);}@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {return new MyViewHolder(LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false));}@Overridepublic void onBindViewHolder(MyViewHolder holder, int position) {ItemInfo curItemInfo = mDatas.get(position);holder.bindData(curItemInfo);// 处理倒计时if (curItemInfo.getCountdown() > 0) {synchronized (mCountdownVHList) {mCountdownVHList.put(curItemInfo.getId(), holder);}}}@Overridepublic int getItemCount() {return mDatas.size();}@Overridepublic void onViewRecycled(MyViewHolder holder) {super.onViewRecycled(holder);ItemInfo curAnnounceGoodsInfo = holder.getBean();if (null != curAnnounceGoodsInfo && curAnnounceGoodsInfo.getCountdown() > 0) {mCountdownVHList.remove(curAnnounceGoodsInfo.getId());}}private Runnable mRefreshTimeRunnable = new Runnable() {@Overridepublic void run() {if (mCountdownVHList.size() == 0) return;synchronized (mCountdownVHList) {long currentTime = System.currentTimeMillis();int key;for (int i = 0; i < mCountdownVHList.size(); i++) {key = mCountdownVHList.keyAt(i);MyViewHolder curMyViewHolder = mCountdownVHList.get(key);if (currentTime >= curMyViewHolder.getBean().getEndTime()) {curMyViewHolder.getBean().setCountdown(0);// 倒计时结束mCountdownVHList.remove(key);notifyDataSetChanged();} else {curMyViewHolder.refreshTime(currentTime);}}}}};}static class MyViewHolder extends RecyclerView.ViewHolder {private TextView mTvTitle;private CountdownView mCvCountdownView;private ItemInfo mItemInfo;public MyViewHolder(View itemView) {super(itemView);mTvTitle = (TextView) itemView.findViewById(R.id.tv_title);mCvCountdownView = (CountdownView) itemView.findViewById(R.id.cv_countdownView);}public void bindData(ItemInfo itemInfo) {mItemInfo = itemInfo;if (itemInfo.getCountdown() > 0) {refreshTime(System.currentTimeMillis());} else {mCvCountdownView.allShowZero();}mTvTitle.setText(itemInfo.getTitle());}public void refreshTime(long curTimeMillis) {if (null == mItemInfo || mItemInfo.getCountdown() <= 0) return;mCvCountdownView.updateShow(mItemInfo.getEndTime() - curTimeMillis);}public ItemInfo getBean() {return mItemInfo;}}static class ItemInfo {private int id;private String title;private long countdown;/*根据服务器返回的countdown换算成手机对应的开奖时间 (毫秒)[正常情况最好由服务器返回countdown字段,然后客户端再校对成该手机对应的时间,不然误差很大]*/private long endTime;public ItemInfo(int id, String title, long countdown) {this.id = id;this.title = title;this.countdown = countdown;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public long getCountdown() {return countdown;}public void setCountdown(long countdown) {this.countdown = countdown;}public long getEndTime() {return endTime;}public void setEndTime(long endTime) {this.endTime = endTime;}}}
Android 发送验证码 简易代码的更多相关文章
- 手机发送验证码—.net代码
注册过程中,短信发送验证码流程如下: (1).用户提交手机号码,申请湖区验证码 (2).网站按照预制规则生成验证码 (3).网站将用户手机号码和验证码发送到短信平台 (4).将制定内容发送到制定手机号 ...
- jQuery手机发送验证码倒计时代码
<!DOCTYPE> <html> <head> <meta charset="UTF-8"> <script type=&q ...
- Android发送验证码的倒计时button
1 直接上图 2 原理 原理非常easy,就是把对应的倒计时逻辑等封装到一个控件中,并向外部提供接口. 3 代码 import java.util.Timer; import java.util.Ti ...
- android发送短信代码(短信内容超长处理)
一条短信只可容纳70个中文,所以当短信长度超过70个中文字符时程序就要特殊处理了. 有两种方式: 1.通过sendTextMessage()方法依次发送拆分后的短信,该方式有个弊端就是用户会分条收到短 ...
- jQuery实现的手机发送验证码倒计时效果代码分享
这是一款基于jquery实现的手机发送验证码倒计时效果代码,可实现实时显示秒数倒计时的功能,还可实现对手机号码格式验证的功能,是一款常用的网站注册发送手机验证码特效代码. 效果描述:注册一个网站,当需 ...
- 网易云信,发送验证码短信C#版代码
网易云信发送短信代码(C# 版)....需要注意SHA1 String有转换小写!!!! using System; using System.Collections.Generic; using S ...
- Android接受验证码自动填入功能(源码+已实现+可用+版本兼容)
实际应用开发中,会经常用到短信验证的功能,这个时候如果再让用户就查看短信.然后再回到界面进行短信的填写,难免有多少有些不方便,作为开发者.本着用户至上的原则我们也应该来实现验证码的自动填写功能,还有一 ...
- js实现发送验证码倒计时按钮
在写注册页面时,有时候需要发送注册邮件来获取验证码,但是为了防止多次重复发送邮件, 必须让按钮隔一段时间后才能再次使用. 代码如下: <html> <head> <met ...
- 前端 js 发送验证码
1. 代码如下: <html> <head> <meta charset="utf-8"> <title></title> ...
随机推荐
- Discuz!源代码阅读笔记之common.inc.php文件【1】
<?php /* [Discuz!] (C)2001-2007 Comsenz Inc. This is NOT a freeware, use is subject to license te ...
- Python 环境
文章出处:http://www.cnblogs.com/winstic/,请保留此连接 总结一下自己使用python过程中安装三方包的方法 Python 安装 Python的安装非常简单,本人使用的w ...
- 无线通信技术协议-6LoWPAN
6LoWPAN:基于IPv6的低速无线个域网标准,即IPv6 over IEEE 802.15.4. 注:6LoWPAN的协议栈实现在Contiki(完整的一套6LoWPAN协议栈).Zephyr(6 ...
- Infinite Scroll–无限分页
一.前言 现在有很多网站都有这样的交互 1.当你往下浏览页面时,页面会自动去异步加载数据. 无限分页效果 infinite scroll 效果图 –ifxoxo.com 2.在页面下方有一个“点击加载 ...
- jquery升级换代
其实从去年开始1.9以上新版的jquery已不再支持toggle方法和live方法. live用on方法替代. 话说这个方法确实挺方便的,那么怎么交替点击呢,html的checked属性我觉得不是很好 ...
- 查看Ubuntu操作系统位数
查看系统是32位还是64位 #查看long的位数,返回32或64 getconf LONG_BIT
- 温习H3C S5500的VLAN配置
这,才是我想要的... ACCESS还是TRUNK TYPE?
- 利用低成本的MCU的UART驱动智能卡
在银行.身份识别和电信市场中,对安全和增强的功能性不断增长的需要,增加了全球范围智能卡的使用.另一方面,这也使得对安全性较低的磁条卡的使用量下降. 然而,所需的基于智能卡系统中,适当的通信系统的硬件和 ...
- c# 基础连接已经关闭: 连接被意外关闭,错误的解决
原文:c# 基础连接已经关闭: 连接被意外关闭,错误的解决 调试一个使用HttpWebRequest模拟提交表单的程序的时候频繁出现上述错误提示,google了一下发现了几个解决方案.1.在appli ...
- MySQL 没有索引 锁全表
<h3 class="title" style="box-sizing: inherit; margin: 8px 0px 15px; padding: 0px; ...