`

android 线程(二)

 
阅读更多

       当第一次启动一个Android程序时,Android会自动创建一个称为“main”主线程的线程。这个主线程(也称为UI线程)很重要,因为它负责把事件分派到相应的控件,其中就包括屏幕绘图事件,它同样是用户与Andriod控件交互的线程。比如,当你在屏幕上按下一个按钮后,UI线程会把这个事件分发给刚按得那个按钮,紧接着按钮设置它自身为被按下状态并向事件队列发送一个无效(invalidate)请求。UI线程会把这个请求移出事件队列并通知按钮在屏幕上重新绘制自身。

       单线程模型会在没有考虑到它的影响的情况下引起Android应用程序性能低下,因为所有的任务都在同一个线程中执行,如果执行一些耗时的操作,如访问网络或查询数据库,会阻塞整个用户界面。当在执行一些耗时的操作的时候,不能及时地分发事件,包括用户界面重绘事件。从用户的角度来看,应用程序看上去像挂掉了。更糟糕的是,如果阻塞应用程序的时间过长(现在大概是5秒钟)Android会向用户提示一些信息,即打开一个“应用程序没有相应(application not responding)”的对话框。

Andriod提供了几种在其他线程中访问UI线程的方法:

  • Activity.runOnUiThread( Runnable )
  • View.post( Runnable )
  • View.postDelayed( Runnable, long )
  • Hanlder


始终记住以下两个关于单线程模型的准则:

  • 不要阻塞UI线程;
  • 一切Android UI操作都在UI线程中执行。



        比较耗时的操作放在后台服务,通过通知机制通知用户使用的活动(activity);
       android有两种方式处理线程:
         在后台线程中处理耗时的操作

  •        使用Handler
           创建后台线程最友好的办法是创建一个Handler子类的实例。只需一个Handler对应一个Activity。自定义的后台线程可与Handler通信,Handler将与UI线程一起工作。和Handler通信,需要两个选项,message和runnable对象。

           Message
           发送Message到Handler,第一步调用obtainMessage(),从池中得到Message对象。
           然后,可通过消息队列将Message发送给Handler,通过sendMessage…()方法族:

           sendMessage() 立即发送Message到消息队列
           sendMessageAtFrontOfQueue() 立即发送Message到队列,而且是放在队列的最前面
           sendMessageAtTime() 设置时间,发送Message到队列
           sendMessageDelayed() 在延时若干毫秒后,发送Message到队列

           为了处理Message,Handler需要实现handleMessage(),当Message出现在队列中时,会调用handleMessage()方法。另外,Handler可在需要时更新UI。

有关线程的使用,这里介绍的很详细了:http://android.blog.51cto.com/268543/343823

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics