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> ...
随机推荐
- Linux删除用户
删除用户 # userdel abc 该删除操作将用户删除但保留用户的home文件夹和邮件文件夹.并且当用户abc正在登录的时候,删除操作将失败,如下: # userdel abc userdel: ...
- 为什么Android AsyncTask的使用要遵循五大原则
引言 AsyncTask是一个围绕Handler和Thread而设计的助手类,封装了在工作线程中与UI交互的细节,只需要对应重写几个回调方法即可,并使得代码更加简洁,优雅.但要注意的是AsyncTas ...
- nopcommerce 二次开发
http://www.cnblogs.com/nopcommerce-b2c/ http://www.nopchina.net/ 数据库结构 http://www.xcode.me/open/docu ...
- JS获取select选中的值
var oSel=oFl.getElementsByTagName('select')[0]; oSel.onchange=function(){ var indexselect=oSel.selec ...
- DEDECMS-helper小助手扩展
今天在做DEDE动态调用模板的时候卡住了,后终被强大的互联网解决,记录解决问题的过程,以备后用 可以在/data/helper.inc.php中进行默认小助手初始化的设置,系统默认载入小助手 例如创建 ...
- 汇编cmp比较指令详解
刚刚看到了cmp指令,一开始有点晕.后来上网找了些资料,终于看明白了,为了方便初学者,我就简单写下我的思路吧.高手绕过,谢谢! cmp(compare)指令进行比较两个操作数的大小 例:cmp opr ...
- 【HDOJ】2896 病毒侵袭
AC自动机模板题. #include <iostream> #include <cstdio> #include <cstring> #include <qu ...
- Linux Shell编程(8)——变量详解
不同与许多其他的编程语言,Bash不以"类型"来区分变量.本质上来说,Bash变量是字符串,但是根据环境的不同,Bash允许变量有整数计算和比较.其中的决定因素是变量的值是不是只含 ...
- Oracle用户管理
创建用户 概述:在oracle中要创建一个新的用户使用create user 语句,一般是具有dba(数据库管理员)的权限才能使用. create user 用户名 identified by 密码: ...
- 高效算法——M 扫描法
In an open credit system, the students can choose any course they like, but there is a problem. Some ...