Android线程的一些问题

          由于刚刚接触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线程的使用就是如此简单。

     

 

 

你可能感兴趣的:(android)