安卓学习日记——handler

  • Handler介绍
    前奏:
    在Android开发中,我们常常会使用单独的线程来完成某些操作,比如用一个线程来完成从网络上下载图片,然后显示在一个ImageView上,在多线程操作时,Android中必须保证以下两点:
    1、不要阻塞UI线程
    2、不要在UI线程之外访问Android UI工具包

例子

 private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 100:
                    textView.setText("下载完成");
                    break;
            }
        }
    };

    public void downloadClick(View v){
        //使用线程模拟下载操作
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    break;
                }
                //下载完成后,更新UI状态
//                textView.setText("下载完成");
                handler.sendEmptyMessage(100);//发送一个空消息,标记为100

//                Message msg=handler.obtainMessage();//获取一个消息对象
//                msg.what=100;
//                msg.obj="要存储的信息";//任意类型
//                handler.sendMessage(msg);//发送消息
//                handler.sendEmptyMessageAtTime(200,System.currentTimeMillis()+3000);//在指定时间后发送
//                handler.sendEmptyMessageDelayed(300,2000);//延迟多少时间后发送消息

            }
        }).start();
    }

通过Handler调用UI组件

  • Handler内部实现原理

Handler实现机制:
1、Message对象,表示要传递的一个消息
2、MessageQueue对象,存放消息对象的消息队列,先进先出原则
3、looper对象负责管理当前线程的消息队列(MessageQueue)
4、Handler对象负责把消息push到消息队列中,以及接收looper从消息队列中取出的消息。

Android启动线程时会在UI线程创建一个MessageQueue。

流程图
在这里插入图片描述

  • 内存泄漏问题

activity退出了,但handler依旧获取到activity的引用,导致activity没有完全退出,导致内存的泄漏。

1、定义一个内部类时,会默认拥有外部类对象的引用,所以建议使用内部类时,最好定义为一个静态内部类

2、引用的强弱:强引用-》软引用-》弱引用

  • 使用Handler实现闪屏页
    闪屏页的作用
    1、欢迎界面
    2、初始化工作

代码块

public class SplashActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                startMainActivity();
            }
        },3000);
    }
    private void startMainActivity(){
        Intent intent=new Intent(this,MainActivity.class);
        startActivity(intent);
    }
    private Handler handler=new Handler();
    }

样式设置
在这里插入图片描述
效果展示
在这里插入图片描述

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值