Android自定义短信倒计时view流程分析
时间:2022-07-27
本文章向大家介绍Android自定义短信倒计时view流程分析,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
倒计时实现有三种方式 而这个自定义view是通过handler实现的。为了保证activity销毁的同时倒计时线程依然进行同时重新创建销毁又不会导致内存泄漏,我使用了handler
的弱引用将handler
和runnable
设置成静态,同时通过一系列变量来销毁关闭线程保存状态,话不多说先看效果图:
下面看源码:
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import com.juexing.payassistant.activity.login.RegisterActivity;
import java.lang.ref.WeakReference;
//待优化为了保存倒计时状态线程延迟一秒关闭所有的子线程
//qq也是如此
public class CountDownTimeView extends androidx.appcompat.widget.AppCompatButton {
private static volatile int i=60;
//用来保存倒计时时间的中转变量
private static volatile int j=0;
private static TimeHandler handler;
//每次启动活动判断i是否为0来读取倒计时时间
public static int getI() {
return i;
}
//RegisterActivity是调用该控件的活动需要在oncreate中将对象传入
public void setActivity(RegisterActivity activity){
handler=new TimeHandler(activity);
}
public static void setI(int i) {
CountDownTimeView.i = i;
}
//防止多次重复点击发送设置的变量
private static volatile boolean send=true;
private class TimeHandler extends Handler {
WeakReference<RegisterActivity timeActivityWeakReference;
public TimeHandler(RegisterActivity registerActivity){
this.timeActivityWeakReference = new WeakReference< (registerActivity);
}
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
RegisterActivity activity=timeActivityWeakReference.get();//获取活动
switch (msg.what){
case 1:
if(i 0){
activity.getmessage. setText(i+"s");
}else {
}
break;
case 2:
activity.getmessage. setText("重新获取");
break;
case 3:
i=j-1;
j=0;
send=false;
handler.postDelayed(runnable,1000);
}
}
};
public CountDownTimeView(Context context) {
super(context);
}
public CountDownTimeView(Context context, AttributeSet attrs) {
super(context, attrs);
}
//网络请求短信成功后调用
public void onStart(CountDownTimeView view){
if(send){
if(i==0){
i=60;
}
handler.postDelayed(runnable,1000);
view.setText(i+"s");
send=false;
}else {
//为了显示不突兀自动减去一秒
view.setText(i-1+"s");
j=i;
//将i设置为0是将所有线程运行完毕关闭释放内存
i=0;
handler.removeCallbacksAndMessages(null);
//因为线程调度随机性所以要延迟一秒发送保证子线程关闭
Message message=Message.obtain();
message.what=3;
handler.sendMessageDelayed(message,1000);
// i=j;
}
}
//设置成静态保证唯一性
public static Runnable runnable=new Runnable() {
@Override
public void run() {
if(i 0){
i--;
Message message=new Message();
message.what=1;
handler.handleMessage(message);
handler.postDelayed(runnable,1000);
}else {
if(j!=0){
}else {
send=true;
Message message=new Message();
message.what=2;
handler.handleMessage(message);
}
}
}
};
}
在activity的oncreate中需要将activity实例对象传入,并进行判断:
getmessage.setActivity(this);
if(getmessage.getI()<60){
if(getmessage.getI() 0){
getmessage.onStart(getmessage);
}else {
getmessage.setText("重新获取");
}
}
}
“`getmessage是自定义view的实例对象。
如要源码可以到我的git上获取:
[https://github.com/heybixby/CountDownTimerView“`](https://github.com/heybixby/CountDownTimerView)
总结
到此这篇关于Android自定义短信倒计时view流程分析的文章就介绍到这了,更多相关android 短信倒计时view内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!
- Python多线程Selenium跨浏览器测试
- Python Selenium设计模式-POM
- 基于Excel参数化你的Selenium2测试
- 创建你的第一个webdriver python代码
- Python Selenium Webdriver安装手册
- 工具篇 - HTTP协议报文结构及示例03
- 工具篇 - JMeter目录及关键配置分析02
- python unittest之加载及跳过测试方法和示例
- python unittest之异常测试
- python unittest之断言及示例
- python unittest关键API说明及示例
- 性能测试必备监控技能linux篇14
- JMeter函数和变量11
- JMeter监听器10
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 解决nginx/apache静态资源跨域访问问题详解
- 可怕的万圣节 Linux 命令
- linux环境不使用hadoop安装单机版spark的方法
- 在linux下玩转带有超时时间的connect函数
- Linux/CentOS服务器安全配置通用指南
- 详解centos7中配置keepalived日志为别的路径
- jointplot快速探究两组变量的分布及关系
- linux中alarm函数的实例讲解
- 如何给Linux虚拟机连上WiFi详解
- Linux系统查看CPU、机器型号、内存等信息
- 实战基本的Linux sed命令示例代码
- 在Linux中如何查看可用的网络接口详解
- Linux程序运行时加载动态库失败的解决方法
- Linux/CentOS系统同步网络时间的2种方法详解
- Linux 常用命令之Linux more命令使用方法