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> ...
随机推荐
- Python自动化运维之31、Tornado框架
Tornado 官网:http://www.tornadoweb.org/en/stable/ Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本. ...
- 如何在Android Studio中使用Gradle发布项目至Jcenter仓库
简述 目前非常流行将开源库上传至Jcenter仓库中,使用起来非常方便且易于维护,特别是在Android Studio环境中,只需几步配置就可以轻松实现上传和发布. Library的转换和引用 博主的 ...
- BZOJ 1046 上升序列
Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且( ax1 < ...
- couchdb and redis
http://www.jdon.com/artichect/scalable5.html http://www.dedecms.com/knowledge/data-base/nosql/2012/0 ...
- logstash 处理各种时间格式
tomcat access日志: { "@version" => "1", "@timestamp" => "2016 ...
- 【HDOJ】2364 Escape
bfs.题目做的不细心,好多小错误.尤其注意起始点就是边界的情况.wa了八次. #include <iostream> #include <cstdio> #include & ...
- Linux Kernel 本地拒绝服务漏洞
漏洞名称: Linux Kernel 本地拒绝服务漏洞 CNNVD编号: CNNVD-201308-090 发布时间: 2013-08-08 更新时间: 2013-08-08 危害等级: 漏洞类 ...
- github继续折腾
又在折腾github了,本来以前在neworiginou这个github上上传过项目的: 现在想在另一个github上joely上传项目,发现按以前的流程做个测试,居然没能上传成功! 经发现,以前的n ...
- 数据结构(动态树):[国家集训队2012]tree(伍一鸣)
[问题描述] 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原 ...
- Manacher Ural 1297 Palindrome
1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB The “U.S. Robots” HQ has just received a ...