Handler与Android多线程详解

时间:2022-04-26 18:23:10 

下面是一段大家都比较熟悉的代码:


Handler handler = new Handler();
handler.post(myThread);


//使用匿名内部类创建一个线程myThread
Runnable mythread = new Runnable() {
public void run() {
}
};

一开始,相信很多人都以为myThread中的run()方法会在一个新的线程中运行,但事实并非如此。

上述代码中的handler并没有调用线程myThread的start()方法,而是直接调用了run()方法,这也就意味着实际上并没有创建一个新的线程,只是在当前线程中调用run()方法而已。

这牵扯出一个问题,如果我们将一个很耗时的操作放到了run()方法内,然后使用一个Handler对象将该线程post到线程队列。原本我们希望将这些耗时操作放到另外一个线程中,以免影响当前进程。但实际上却恰恰相反:post()以下的那些代码必须等到run()方法执行完毕后才能继续执行。如当前线程为主线程,那么主程序便会处于硬直状态。

那么应该如何去实现真正的多线程呢?

一种最简便的方法就是直接利用JAVA中的实现多线程的方法,即建立一个Thread对象,然后调用start()方法。

还有另外一种方法,代码如下:


//HandlerThread建立了一个新线程,它包含一个Looper
HandlerThread handlerThread = new HandlerThread("handler_Thread");
handlerThread.start();//启动一个线程
MyHandler myHandler = new MyHandler(handlerThread.getLooper());//使用新线程的Looper建立一个Handler
//此时MyHandler便与一个新线程绑定到一起了

Message msg = myHandler.obtainMessage();
msg.sendToTarget();//将message压入提供message的Handler的消息队列中

//建立一个Handler的子类
class MyHandler extends Handler {
MyHandler(Looper looper) {
super(looper);
}
public void handleMessaage(Message msg) {
//处理消息的代码
}
}

今天我又仔细的看了一下Android文档,发现android虽然支持上两种建立线程的方法,但是它有一个规则:

原文是:it violates the second rule of the single-threaded model: do not access the Android UI toolKit from outside the UI thread.

大概意思就是:Android不支持在UI线程以外的线程中修改UI控件。比如给一个Textview设置文字,这样的操作便不能放在UI线程以外的线程内执行,否则便会出现异常。

标签:Handler,Android
0
投稿

猜你喜欢

  • Java swing读取txt文件实现学生考试系统

    2021-06-13 17:41:02
  • C#常用日期时间方法汇总

    2023-01-04 23:44:55
  • c#如何使用 XML 文档功能

    2023-12-25 03:44:33
  • Android Usb设备的监听(Dev)外设端口的判定以及耳机的插拔

    2022-12-07 19:23:44
  • Spring boot配置文件加解密详解

    2023-11-12 00:17:29
  • SpringBoot实现本地存储文件上传及提供HTTP访问服务的方法

    2022-09-14 19:09:12
  • JAVA包装类及自动封包解包实例代码

    2022-10-23 13:28:54
  • Android实现截屏功能

    2022-10-25 04:36:52
  • C#实现实体类和XML相互转换

    2023-06-16 04:37:32
  • C# ping网络IP 实现网络状态检测的方法

    2023-01-11 14:31:05
  • Android HorizontalScrollView滑动与ViewPager切换案例详解

    2023-06-05 00:48:27
  • Java源码解析之ClassLoader

    2022-06-14 06:07:47
  • Java SpringBoot实现带界面的代码生成器详解

    2023-09-28 11:54:14
  • java中的前++和后++的区别示例代码详解

    2023-09-01 10:15:01
  • Java使用substring()截取(提取)子字符串

    2023-09-29 17:02:04
  • Java规则引擎Easy Rules的使用介绍

    2023-05-04 01:42:57
  • Android嵌套滚动NestedScroll的实现了解一下

    2022-09-10 13:48:57
  • Springboot 使用maven release插件执行版本管理及打包操作

    2023-07-12 01:20:35
  • C#实现的简单验证码识别实例

    2022-09-16 03:44:11
  • c#典型工厂化实现实例

    2022-01-04 19:41:08
  • asp之家 软件编程 m.aspxhome.com