Android自定義簡訊倒計時view流程分析
阿新 • • 發佈:2020-03-31
倒計時實現有三種方式 而這個自定義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內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!