android-Handle 定时器

package com.example.handleproject;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;

public class TimeDown extends AppCompatActivity {

    public static final int COUNT_TIME_CODE = 100002;
    public static final int MAX = 10;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time_down);
        final TextView countdownTimeTetView=(TextView) findViewById(R.id.time);
        Handler handler=new Handler(){
            @Override
            public void handleMessage(@NonNull Message msg) {
                super.handleMessage(msg);
                if (msg!=null&&msg.what==COUNT_TIME_CODE){
                    Log.d("tagggg", "handleMessage:"+msg.arg1);

                    countdownTimeTetView.setText(String.valueOf(msg.arg1));
                    if(msg.arg1>=1){
                        Message message=Message.obtain();//从Handle的缓存池里面拿到实例
                        message.what= COUNT_TIME_CODE;
                        message.arg1=msg.arg1-1;
                        sendMessageDelayed(message,1000);//因为他本身在handle里面运行所以不需要this
                    }

                }
            }
        };
        Message message=Message.obtain();//从Handle的缓存池里面拿到实例
        message.what= COUNT_TIME_CODE;
        message.arg1= MAX;
        handler.sendMessageDelayed(message,1000);
    }
}

警告⚠️:

android-Handle 定时器_第1张图片

编辑器提示Handler应该是个静态类,否则可能导致内存泄漏,因为handle是异步额,它的内部可能持有当前activity的引用,

如果activity应该销毁的时候,可能因为handle内部持有这个activity导致这个activity无法销毁,这时候就需要使用弱类型引用

和ios的block函数同理

我们修改下代码如下:

package com.example.handleproject;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;

import java.lang.ref.WeakReference;

public class TimeDown extends AppCompatActivity {

    public static final int COUNT_TIME_CODE = 100002;
    public static final int MAX = 10;
    private  TextView countdownTimeTetView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time_down);
        countdownTimeTetView=findViewById(R.id.time);
        Handler handler=new CountDownTimeHandler(this);//封装handle
        Message message=Message.obtain();//从Handle的缓存池里面拿到实例
        message.what= COUNT_TIME_CODE;
        message.arg1= MAX;
        handler.sendMessageDelayed(message,1000);


    }
    public  static  class CountDownTimeHandler extends Handler {
        final WeakReference mainActivityWeakReference;//弱引用
        public CountDownTimeHandler(TimeDown mainActivityWeakReference) {
            this.mainActivityWeakReference =new WeakReference<>(mainActivityWeakReference);
        }

        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            if (msg!=null&&msg.what==COUNT_TIME_CODE){
                TimeDown activity=mainActivityWeakReference.get();//获取activity
                int val=msg.arg1;
               activity.countdownTimeTetView.setText(String.valueOf(val));
                if(msg.arg1>=1){
                    Message message=Message.obtain();//从Handle的缓存池里面拿到实例
                    message.what= COUNT_TIME_CODE;
                    message.arg1=msg.arg1-1;
                    sendMessageDelayed(message,1000);//因为他本身在handle里面运行所以不需要this
                }

            }

        }
    }
}

 

你可能感兴趣的:(android)