Android中Handler的使用

来源:互联网 发布:数据库第五版答案 编辑:程序博客网 时间:2024/06/06 18:01

Android中Handler的使用

Handler的作用:用于线程和线程之间通信,可以看成一个生产者消费者模型

//      产品      Message
// 仓库 MessageQueue
// 循环 Looper
// 物流 Handler
// 回调接口 Handler.Callback

30.1Handler介绍:

Android开发中,我们经常会使用单独的线程来完成某些操作,比如用一个线程完成从网上下载的图片显示在ImageView上,在多线程操作时,Android中必须保证以下两点:

1:不要阻塞UI线程

2:不要再UI线程之外访问Android UI 工具包

30.2:Handler常用API

使用Handler可以完成以下两点的工作

1:消息调度和在将来的某个时间点执行一个Runnable

Android中Handler的使用2:多个任务加入到一个队列中执行

使用Handler可以完成以下两点的工作

1:消息调度和在将来的某个时间点执行一个Runnable

2:多个任务加入到一个队列中执行

建一个Handler handler = newHandler(){

重写方法:switch(msg.what){

Case 100:

设置代码内容

break;

}

}

handler.sendEmptyMessage(100);//发送一个空消息,标记为100

完整代码如下:

Message message = handler.obtainMessage();
message.what= 101;
message.obj= "要存储的消息";
handler.sendMessage(message);

handler.sendEmptyMessageAtTime(200,System.currentTimeMillis()+3000);
handler.sendEmptyMessageAtTime(200,3000);//延迟多少时间发送




30.3Handler内部实现原理

1:Message对象,表示要传递的一个消息

2:MessageQueue对象,表示存放消息的消息队列,先进先出原则

3:Looper负责管理当前线程的消息队列(MessageQueue)

4:Handler负责将消息push到消息队列中,以及接收到Looper从消息队列中获取的消息

30.4:Handler内存泄漏问题分析

1:定义一个内部内时,会默认拥有外部类对象的引用,所以建议使用内部 类时最好定义为静态内部类(相当于一个外部内,不依赖外部类)

2:引用的强弱,强引用:new 的对象都是强引用,不会被回收

-->软引用:如果你的引用引用到另外一个对象,当内存不足时将会回收软引用

-->弱引用:如果你引用的对象不存在,将拿不到

  private MyHandler handler = newMyHandler(this);
    privatestatic class MyHandler extends Handler{
       WeakReference weakReference;
       public MyHandler(otherscreen other){
           weakReference = new WeakReference(other);
       }
       @Override
       public void handleMessage(Message msg) {
           super.handleMessage(msg);
           otherscreen other = weakReference.get();
           if(other!=null){

           }else{
               return;
           }
       }
   }

30.5:使用Handler实现APP的闪屏页

如何设置全屏:theme = @android:style/Theme.DeviceDefault.Light.NoActionbar.Fullscreen

闪屏页的作用

1:提供一个欢迎界面

2:初始化工作

 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_otherscreen);
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();


1 0
原创粉丝点击