溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android自定義短信倒計(jì)時(shí)view流程的示例分析

發(fā)布時(shí)間:2021-05-07 14:27:58 來源:億速云 閱讀:168 作者:小新 欄目:移動(dòng)開發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)Android自定義短信倒計(jì)時(shí)view流程的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

Android是什么

Android是一種基于Linux內(nèi)核的自由及開放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦,由美國Google公司和開放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。

倒計(jì)時(shí)實(shí)現(xiàn)有三種方式 而這個(gè)自定義view是通過handler實(shí)現(xiàn)的。為了保證activity銷毀的同時(shí)倒計(jì)時(shí)線程依然進(jìn)行同時(shí)重新創(chuàng)建銷毀又不會(huì)導(dǎo)致內(nèi)存泄漏,我使用了handler的弱引用將handler和runnable設(shè)置成靜態(tài),同時(shí)通過一系列變量來銷毀關(guān)閉線程保存狀態(tài),話不多說先看效果圖:

Android自定義短信倒計(jì)時(shí)view流程的示例分析

下面看源碼:

 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;
//待優(yōu)化為了保存倒計(jì)時(shí)狀態(tài)線程延遲一秒關(guān)閉所有的子線程
//qq也是如此
public class CountDownTimeView extends androidx.appcompat.widget.AppCompatButton {
  private static volatile int i=60;
  //用來保存倒計(jì)時(shí)時(shí)間的中轉(zhuǎn)變量
  private static volatile int j=0;
  private static TimeHandler handler;
//每次啟動(dòng)活動(dòng)判斷i是否為0來讀取倒計(jì)時(shí)時(shí)間
  public static int getI() {
    return i;
  }
  //RegisterActivity是調(diào)用該控件的活動(dòng)需要在oncreate中將對(duì)象傳入
public void setActivity(RegisterActivity activity){
    handler=new TimeHandler(activity);
}
  public static void setI(int i) {
    CountDownTimeView.i = i;
  }
  //防止多次重復(fù)點(diǎn)擊發(fā)送設(shè)置的變量
  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();//獲取活動(dòng)
      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);
  }
//網(wǎng)絡(luò)請(qǐng)求短信成功后調(diào)用
  public void onStart(CountDownTimeView view){
   if(send){
     if(i==0){
       i=60;
     }
     handler.postDelayed(runnable,1000);
     view.setText(i+"s");
     send=false;
   }else {
       //為了顯示不突兀自動(dòng)減去一秒
       view.setText(i-1+"s");
       j=i;
       //將i設(shè)置為0是將所有線程運(yùn)行完畢關(guān)閉釋放內(nèi)存
       i=0;
       handler.removeCallbacksAndMessages(null);
       //因?yàn)榫€程調(diào)度隨機(jī)性所以要延遲一秒發(fā)送保證子線程關(guān)閉
       Message message=Message.obtain();
       message.what=3;
       handler.sendMessageDelayed(message,1000);
//     i=j;
   }
  }
 //設(shè)置成靜態(tài)保證唯一性
  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實(shí)例對(duì)象傳入,并進(jìn)行判斷:

 getmessage.setActivity(this);
    if(getmessage.getI()<60){
      if(getmessage.getI()>0){
        getmessage.onStart(getmessage);
      }else {
        getmessage.setText("重新獲取");
      }

    }

  }

```getmessage是自定義view的實(shí)例對(duì)象。

關(guān)于“Android自定義短信倒計(jì)時(shí)view流程的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI