解析Android中线程的好处
创始人
2024-07-30 18:00:24
0

一、Android有两种方式处理线程:

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

二、使用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。

以下示例演示一个进度条,每隔1秒钟增加1/20个单位。效果图:

 

 

java代码:

  1.  
  2. android:orientation="vertical"   
  3. android:layout_width="fill_parent" 
  4. android:layout_height="fill_parent"> 
  5. android:id="@+id/progress" 
  6. style="?android:attr/progressBarStyleHorizontal"   
  7. android:layout_width="fill_parent" 
  8. android:layout_height="wrap_content" /> 
  9.  

java代码:

  1. package eoe.demo;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.os.Handler;  
  5. import android.os.Message;  
  6. import android.widget.ProgressBar;  
  7. public class ShowThread extends Activity {  
  8. ProgressBar bar;  
  9. Handler handler = new Handler() {  
  10. @Override  
  11. public void handleMessage(Message msg) {  
  12. bar.incrementProgressBy(5);  
  13. }  
  14. };  
  15. boolean isRunning = false;  
  16. /** Called when the activity is first created. */  
  17. @Override  
  18. public void onCreate(Bundle savedInstanceState) {  
  19. super.onCreate(savedInstanceState);  
  20. setContentView(R.layout.main);  
  21. bar = (ProgressBar) findViewById(R.id.progress);  
  22. }  
  23. @Override  
  24. protected void onStart() {  
  25. super.onStart();  
  26. bar.setProgress(0);  
  27. Thread background = new Thread(new Runnable() {  
  28. @Override  
  29. public void run() {  
  30. for (int i = 0; i < 20 && isRunning; i++) {  
  31. try {  
  32. Thread.sleep(1000);  
  33. } catch (InterruptedException e) {  
  34. }  
  35. handler.sendMessage(handler.obtainMessage());  
  36. }  
  37. }  
  38. });  
  39. isRunning = true;  
  40. background.start();  
  41. }  
  42. @Override  
  43. protected void onStop() {  
  44. super.onStop();  
  45. isRunning = false;  
  46. }  

小结:

当第一次启动一个android程序是,android会自动创建一个称为“main”主线程的线程。这个线程很重要,因为它负责吧时间分派到相应对控件,其中就包括屏幕绘图时间,它同样是用户与android控件交互的线程。

【编辑推荐】

Android 计时器Timer用法

Android智能手机操作系统

常用的Android指令和模拟器参数

用C#实现HTTP协议下的多线程文件传输

SQL点滴之收集SQL Server线程等待信息

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...