时间:2021-05-20
倒计时实现有三种方式 而这个自定义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内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
实现的主要功能如下:1.点击按钮的时候,可以进行倒计时,倒计时自定义。2.当接收短信失败后,倒计时停止,可点击重新发送短信。3.点击的元素支持一般标签和inpu
本文实例为大家分享了Android自定义View倒计时圆的具体代码,供大家参考,具体内容如下创建attr创建DisplayUtil类importandroid.
Android自定义View之倒计时实例代码需求:大多数app在注册的时候,都有一个获取验证码的按钮,点击后,访问接口,最终用户会收到短信验证码。为了不多次写这
一个简单的自定义view。在里面封装了时间的倒计时,以及距离现在时间的时间计算publicclassTimerTextViewextendsLinearLayo
这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能。首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件:activ