android GUI线程安全

Activity:运行于主线程。因Android的GUI是非线程安全的,所有界面相关操作必须在主线程中完成,又因为即时响应的需要,主线程中不能进行耗时长的操作,如果有些操作既耗时又需要操作界面,就用消息机制吧。开子线程处理耗时操作,需要操作界面时给主线程发消息,把界面操作限制在主线程中。好在Android的消息机制还是相当方便的。

Service:服务本体运行于主线程,但响应函数(就是onBind返回的对象的接口啦)就复杂了。如果跟客户在同一个进程的话,就直接在客户的线程中运行,否则就从服务所在进程维护的线程池里取出一个线程来运行,如果同时有多个进程请求服务的话,就同时产生多个线程来响应。所以,想要提供给别人使用的服务必须做成线程安全的,否则就不要提供第三方使用的接口好啦,免得别人自做多情。

Content provider:跟服务相似。不过数据提供者的响应函数是固定的:<code style="font-style: normal;"><a style="margin: 0px 0px 0px 6px; color: #d59139; text-decoration: underline;" href="http://blog.csdn.net/zouxueping/archive/2010/reference/android/content/ContentProvider.html#query(android.net.Uri,%20java.lang.String%5B%5D,%20java.lang.String,%20java.lang.String%5B%5D,%20java.lang.String)">query()</a><code style="font-style: normal;"><a style="margin: 0px 0px 0px 6px; color: #d59139; text-decoration: underline;" href="http://blog.csdn.net/zouxueping/archive/2010/reference/android/content/ContentProvider.html#insert(android.net.Uri,%20android.content.ContentValues)">insert()</a><code style="font-style: normal;"><a style="margin: 0px 0px 0px 6px; color: #d59139; text-decoration: underline;" href="http://blog.csdn.net/zouxueping/archive/2010/reference/android/content/ContentProvider.html#delete(android.net.Uri,%20java.lang.String,%20java.lang.String%5B%5D)">delete()</a><code style="font-style: normal;"><a style="margin: 0px 0px 0px 6px; color: #d59139; text-decoration: underline;" href="http://blog.csdn.net/zouxueping/archive/2010/reference/android/content/ContentProvider.html#update(android.net.Uri,%20android.content.ContentValues,%20java.lang.String,%20java.lang.String%5B%5D)">update()</a>, and <code style="font-style: normal;"><a style="margin: 0px 0px 0px 6px; color: #d59139; text-decoration: underline;" href="http://blog.csdn.net/zouxueping/archive/2010/reference/android/content/ContentProvider.html#getType(android.net.Uri)">getType()</a>。数据库应该是安全的,自己做的就要加倍小心啦。

Broadcast receiver:运行于主线程。它就一个方法,运行时跟当前Activity一样,优先级超高,是不能被杀死的,但方法一返回,就打入冷宫,随时可能被害,即便它运行时派生了子线程也不能母凭子贵,母子双双被害,更是人间惨剧。所以receiver中通常启动服务来做耗时的后台操作,启动Activity或任务栏通知来做界面响应。

相关推荐