Handler

一般用与定时任务和不同线程间的通信。

Handler.sendMessage();

Handler.post();

handler.sendMessageAtTime(message, SystemClock.uptimeMillis()+3000); handler.sendMessageDelayed(message,2000);/*两秒后*/
handler.post(runnable); handler.postDelayed(runnable,2000);

最简单实现

将耗时操作放在子线程

package com.example.handlerproject;

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.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    static String Tag="MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        /**
         * UI线程
         * */
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView=findViewById(R.id.textview);
        //创建handler
        Handler handler=new Handler(){
            @Override
            public void handleMessage(@NonNull Message msg) {
                super.handleMessage(msg);
                /**
                 *主线程接到子线程发出的消息处理 
                 **/
                //处理消息
                Log.i(Tag,"handlermessage:"+msg.what);
                if (msg.what==1001){
                    textView.setText("imooc");
                }

            }
        };



        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //有可能有大量耗时操作
                /**
                 * 子线程
                 * */
                
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        //通知UI更新
                        handler.sendEmptyMessage(1001);

                    }
                }).start();

            }
        });

    }
}

静态Handler

防止activity被清理内存泄漏

package com.example.handler2;

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

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.widget.TextView;

import java.lang.ref.WeakReference;

public class MainActivity extends AppCompatActivity {
//倒计时标记code
    private int COUNTDOWN_TIME_CODE = 100001;
    //倒计时最大值
    private int  MAX_COUNT = 10;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //得到控件
        textView = findViewById(R.id.countdownTimeTextView);
        //创建handler
        CountdownTimeHandler handler = new CountdownTimeHandler(MainActivity.this) ;
        //新建了消息Message
        Message message = Message.obtain();

        message.what = COUNTDOWN_TIME_CODE;

        message.arg1= MAX_COUNT;
        //第一次发送
        handler.sendMessageDelayed(message, 1000);


    }

    public static class CountdownTimeHandler extends Handler {
        //弱引用
        final WeakReference<MainActivity> mainActivityWeakReference;


        public CountdownTimeHandler(MainActivity activity) {
            this.mainActivityWeakReference =new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            MainActivity activity=mainActivityWeakReference.get();

            switch (msg.what){
                case 100001:
                    int value= msg.arg1;
                    activity.textView.setText(String.valueOf(value--));
                    //循环发的消息控制
                    if (value>=0){
                        Message message=Message.obtain();
                        message.what=100001;
                        message.arg1=value;
                        sendMessageDelayed(message,10000);
                    }
                    break;

            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值