Android线程学习

      线程是一个程序的运行态,所以单从静态的代码理解线程是不全面的,需要动态的去理解一个线程。线程不像进程拥有独立的内存,cpu等(尽管是虚拟的,但如果透明掉操作系统的实现,那可以理解为进程是独立的,不用考虑很多同步等问题)。而我们知道android的framework里提供了几种类型的组件: Activity, Intent,ContentProvider,service等,Activity包含在主线程里,主线程就是通常我们说的UI线程,然后android中的GUI不是“线程安全”的,也就是说其他非UI线程去操作UI的话可能引起问题,所以在Android framework里,所有关于UI的操作都是由UI线程来做的。

     这里涉及一个线程通信的问题。Android里推荐的一个方法是采用Handler对象来实现的。

类似代码: mMainThreadHandle = new Handler(){
@Override
public void handleMessage(Message msg){
switch( msg.what ){
case XXX:
DoSomething(msg);
break;
case YYY:
DoOtherthing(msg);
break;
default:

                                                break;
}
}
};
}

这样,“主线程”实现了消息监听;

于是在另外一个线程里

      Message msg = mMainThreadHandle.obtainMessage(XXX);
      msg.getData().putString("name", name);
      msg.sendToTarget();

控制权就从该线程交给了“主线程”,实现了线程通信(call,回调)。

Android的每个线程里都有一个Looper对象,它可以帮助线程维护一个消息队列,所以初始化线程时,要初始化只要有Looper对象的线程,别的线程就可以向它发消息。

线程里要先执行如下代码:

Looper.prepare();

Looper.loop();

这样就启动了该线程的消息监听队列。

      一般来说,如果Android的程序是java的,但是如果运行了JNI,当然也可以包含c代码,这时c的运行应该被包裹在Java的线程里。也就是说c层和java层的JNI调用是同步的。在c层,最好不用用线程机制的代码。

     Android单线程模型:由于Android的UI操作必须由主线程来完成,所以UI操作可以采用单线程模型。单线程模型会在没有考虑到它的影响的情况下引起Android应用程序性能低下,因为所有的任务都在同一个线程中执行,如果执行一些耗时的操作,如访问网络或查询数据库,会阻塞整个用户界面。当在执行一些耗时的操作的时候,不能及时地分发事件,包括用户界面重绘事件。从用户的角度来看,应用程序看上去像挂掉了。更糟糕的是,如果阻塞应用程序的时间过长(现在大概是5秒钟)Android会向用户提示一些信息。所以其他线程想要进行绘制操作时,只能利用线程间消息传递来告诉UI线程去操作。






你可能感兴趣的:(java,android,UI,数据库,jni,service)