Android线程的一些问题
16lz
2021-01-25
由于刚刚接触android还不是完全了解其内部机制,但是其毕竟是使用java开发,所以对于语言格式还是基本没有太大的区别,多的只是一些配置文件等等。但是关于线程这方面,却有一些区别。大家都知道,android是linux上的操作系统,后期才被移植到手机上。每当程序启动,会启动一个进程表示程序本身,然后一个线程即主线程执行一定任务。在内存不足时,android会自动释放一些低级进程(对于进程等级,android本身有其自己的算法,普通情况从高到低为 前台进程>可见进程>服务进程>后台进程>空进程)。
对于android的线程,首先先了解其单线程模型。在android中,其启动的主线程负责UI界面的控制与处理如点击事件、画图操作等等,并且不允许其他线程使用或更改UI界面。总之:“在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行”。如果幕后的线程来执行UI对象,Android就会发出错误讯息CalledFromWrongThreadException。这样如果以后遇到此问题就可以检查一下线程是否违反了原则。但是当主线程想要借助其他线程处理UI或者绘制图像就出现了一定问题。为了解决类似的问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该 Message Queue 并结合Handler和Looper组件进行信息交换。Message类:线程之间用来通信的对象。 Handler类:就是message的主要处理者可以在一个线程的run方法中调用handler对象的 postMessage或sendMessage方法来实现,Android程序内部维护着一个消息队列,会轮训处理这些,如果你是Win32程序员可以很好理解这些消息处理,不过相对于Android来说没有提供 PreTranslateMessage这些干涉内部的方法。 Looper类: 其实Android中每一个Thread都跟着一个Looper,Looper可以帮助Thread维护一个消息队列,并可以与一个handler绑定,来实现一个线程同步机制。 其实听起来 很复杂,但是实际在操作上其实很容易理解。由于我也是初学,没有深入理解。 所以这里也就简单说一下他们的使用方法。简单来说你想让那个线程执行代码,例如让主线程实现UI界面的操作,就获取主线程的looper。然后创建一个你自己的handle类绑定这个looper。代码如下:
...... Looper looper=Looper.myLooper(); final MyHandler myhandle = new MyHandler(looper); .......class MyHandler extends Handler{public MyHandler(Looper looper){super(looper);}public void handleMessage(Message message){................}}这样绑定好之后,当有其他线程调用handler的sendmessage方法的时候,就会告知handle类的中继承的handleMessage方法执行相应代码。类似一个生产者消费者模型。由于handle是在主线程中执行的handleMessage方法,所以就不存在上述 CalledFromWrongThreadException 错误了。
new Thread(){public void run(){while(true){Message message=Message.obtain();myhandle.sendMessage(message);} }}}.start();用其他线程通知当前线程执行代码,然后用message来传递信息。Android线程的使用就是如此简单。
更多相关文章
- 一款霸榜 GitHub 的开源 Linux 资源监视器!
- Android开发AsyncTask异步处理任务使用方法及注意事项
- Android(安卓)跨进程传输大图片
- android开发笔记(一)Android(安卓)studio 输入法
- Android(安卓)IOS WebRTC 音视频开发总结(十二)-- sufaceview
- Android(安卓)中 Service 学习,开篇
- [置顶] Android(安卓)进程常驻(2)----细数利用android系统机制的保
- Android之EventBus1.0 和EventBus3.0的使用详解
- Google Android如何分析和研究Log文件 ,如何看日志信息