android通过两种方法开启一个线程_第1页
android通过两种方法开启一个线程_第2页
android通过两种方法开启一个线程_第3页
android通过两种方法开启一个线程_第4页
android通过两种方法开启一个线程_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

android 通过两种方法开启一个线程通过两种方法开启一个线程 大家都知道 在 PC 上的应用程序当需要进行一些复杂的数据操作 但不需要界面 UI 的时候 我们会为应用程序专门写一个线程去执行这些复杂的数据操作 通过线程 可以 执行例如 数据处理 数据下载等比较耗时的操作 同时对用户的界面不会产生影响 在 Android 应用程序开发中 同样会遇到这样的问题 当我们需要访问网络 从网上下载数 据并显示在我们的 UI 上时 就会启动后台线程去下载数据 下载线程执行完成后将结果返 回给主用户界面线程 对于线程的控制 我们将介绍一个 Handler 类 使用该类可以对运行在不同线程 中的多个任务进行排队 并使用 Message 和 Runnable 对象安排这些任务 在 javadoc 中 对 Handler 是这样解释的 Handler 可以发送和处理消息对象或 Runnable 对象 这些消息 对象和 Runnable 对象与一个线程相关联 每个 Handler 的实例都关联了一个线程和线程 的消息队列 当创建了一个 Handler 对象时 一个线程或消息队列同时也被创建 该 Handler 对象将发送和处理这些消息或 Runnable 对象 下面有几种对 Handler 对象的构造方法需要了解一下 a 如果 new 一个无参构造函数的 Handler 对象 那么这个 Handler 将自动与当前运 行线程相关联 也就是说这个 Handler 将与当前运行的线程使用同一个消息队列 并且可 以处理该队列中的消息 private Handler handler new Handler 我们做这样一个实验 在主用户界面中创建一个带有无参构造函数的 Handler 对 象 该 Handler 对象向消息队列推送一个 Runnable 对象 在 Runnable 对象的 run 函数中 打印当前线程 Id 我们比较主用户界面线程 ID 和 Runnable 线程 ID 是否相同 具体代码 如下 public class HandlerTest01 extends Activity Override public void onCreate Bundle savedInstanceState super onCreate savedInstanceState setContentView R layout main System out println Activity Thread currentThread getId handler post r private Handler handler new Handler private Runnable r new Runnable Override public void run try Thread sleep 2000 catch InterruptedException e TODO Auto generated catch block e printStackTrace System out println Runnalbe Thread currentThread getId 通过这个例子的输出可以发现 Runnable 对象和主用户界面线程的 ID 是相同 在这个 例子中 我们直接利用 handler 对象 post 了一个 runnable 对象 相当于直接调用了 Runnable 对象的 run 函数 也就说没有经过 start 函数调用 run 那么就不会创建一个新 线程 而是在原有线程内部直接调用 run 方法 因此输出的线程 Id 是相同的 b 如果 new 一个带参构造函数的 Handler 对象 那么这个 Handler 对象将与参数所表示 的 Looper 相关联 注意 此时线程类应该是一个特殊类 HandlerThread 类 一个 Looper 类的 Thread 类 它继承自 Thread 类 HandlerThread handlerthread new HandlerThread MyThread handlerthread start private MyHandler handler new MyHandler handlerthread getLooper class MyHandler extends Handler public MyHandler public MyHandler Looper looper super looper 下面这个例子 将介绍如何开启一个新的线程 并通过 Handler 处理消息 HandlerTest02 java public class HandlerTest02 extends Activity private MyHandler myhandler null Override protected void onCreate Bundle savedInstanceState TODO Auto generated method stub super onCreate savedInstanceState this setContentView R layout main System out println Activity Thread currentThread getId 生成一个 HandlerThread 对象 使用 Looper 来处理消息队列 HandlerThread thread new HandlerThread MyThread 必须启动这个线程 thread start 将一个线程绑定到 Handler 对象上 则该 Handler 对象就可以处理线程的消息 队列 myhandler new MyHandler thread getLooper 从 Handler 中获取消息对象 Message msg myhandler obtainMessage 将 msg 对象发送给目标对象 Handler msg sendToTarget class MyHandler extends Handler public MyHandler 带有参数的构造函数 public MyHandler Looper looper super looper Override public void handleMessage Message msg System out println MyHandler Thread currentThread getId 根据这个例子返回的结果 可以看出 新线程 Id 与主用户界面的线程 Id 不同 由于我们 调用了 thread start 方法 真正的创建了一个新线程 与原来的线程处于不同的线程上下 文中 因此打印输出的线程 Id 是不同的 c 如果需要 Handler 对象去处理消息 那么就要重载 Handler 类的 handleMessage 函数 private Handler handler new Handler Override public void handleMessage Message msg TODO Handle the msg Usually we update UI here 注意到注释部分 我们通常在 handleMessage 中处理更新 UI 界面的操作 前面介绍了 Handler 类的基本使用 但是还是没有涉及到 Thread 类 要想实现在后 台重新开启一个新的线程 通过该线程执行一些费时的操作 我们也使用 Thread 类来完 成这个功能 下面我们先给出一个使用 Thread 类的例子程序 ThreadTest java public class ThreadTest extends Activity Override protected void onCreate Bundle savedInstanceState TODO Auto generated method stub super onCreate savedInstanceState this setContentView R layout main System out println Activity Thread currentThread getId Thread thread new Thread r thread start try Thread currentThread sleep 1000 catch InterruptedException e TODO Auto generated catch block e printStackTrace thread stop Runnable r new Runnable Override public void run System out println Runnable Thread currentThread getId 这个程序执行的结果如下 新线程在创建对象时 传入了 Runnable 类的一个对象 在 Runnable 对象中重载了 run 方法去执行耗时的操作 新的线程实例执行了 start 方法 开 启了一个新的线程执行 Runnable 的 run 方法 上面这些就是我现在接触到执行线程的方法 在线程中 可以完成我们所需要的操作 比如 下载 处理数据 检测网络状态等 使其与 UI 界面分离 那么 UI 界面不会因为 耗时操作导致界面被阻塞 在 解密 Google Android 一书中 发现了这样一个启动线程的模型 利用该模型 我们可以把一些耗时的操作放到 doStuff 方法中去执行 同时在 updateUIHere 方法中进行 更新 UI 界面的操作 就可以完成一个线程所需要的功能 其他的说明写在注释部分了 Handler myHandler new Handler public void handleMessa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论