第三周

Handler

Handler 的功能

第三周_第1张图片

Handler 最常用的功能就是更新 UI。因为 Android 只能在主线程中更新 UI,但是更新 UI 之前往往要先更新数据,这就需要一些 I/O 操作,比如请求网络数据,或者读写文件。但是这些 I/O 操作大部分都比较耗时。而 Android 中的耗时操作又需要在子线程中执行。所以当耗时操作完成后我们需要将更新 UI 的操作切换到主线程,或者说将更新的数据发送到主线程。此时就用到了 Handler。从上面的描述中我们可以看到 Handler 的作用是将数据从子线程发送到主线程里去操作。那么同样的我们也可以将数据从主线程发送到子线程。此时,我可以得出结论,Handler 的功能是:实现线程间的数据传递。

Handler 用法

因为 Handler 工作时需要 Looper,所以我们要为当前线程创建一个 Looper。如下面代码:

Java

newThread("Thread2"){

@Overridepublicvoidrun(){

Looper.prepare();

Handlerhandler=newHandler();

Looper.loop();

}

}.start();

但是 Android 的主线程会为我们默认初始化 Looper,所以如果在主线程中使用 Handler 就无需手动创建 Looper。通常情况下,我们使用 Handler 的默认工造函数创建 Handler 对象,并重写其 handleMessage 方法。代码如下:

Java

privateHandlerhandler=newHandler(){

@OverridepublicvoidhandleMessage(Messagemsg){

//处理Message ,比如更新 UI

}

};

然后,在耗时操作完成后,发送携带数据的 Message,代码如下:

Java

newThread("Thread3"){

@Overridepublicvoidrun(){

//耗时操作,比如请求网络

Messagemsg=Message.obtain();

handler.sendMessage(msg);

}

}.start();

其次,Handler 还可以通过 post 方法将一个 Runnable 对象投递到 Handler 中去处理。代码如下:

Java

handler.post(newRunnable(){

@Overridepublicvoidrun(){

}

});

在上述代码中,我们使用匿名内部类的方式来使用 Handler,但是这种方式往往会导致内存泄露。因为匿名内部类默认持有外部类的引用,如果我们在 Activity 中通过上述代码使用 Handler,那么上述 Handler 对象将持有 Activity 的引用。而执行耗时操作的子线程持有 Handler 的引用。如果我们在耗时操作完成之前退出 Activity,而耗时操作还没有完成,那么子线程将继续在后台执行,将导致 Activity 不能被正常的销毁回收,所以将导致内存泄露。

你可能感兴趣的:(第三周)