出于性能优化的考虑,Android的UI线程不是线程安全的。这致使我们不能在Android的UI线程中执行一些费时的操作,如下载、刷新等。Android中只允许UI线程对Activity中的UI组件进行修改。

不过我们可以新建一条线程来代替UI线程执行这一操作,在Android中可以借助于Handler的消息传递机制来实现。

Handler类的两个主要作用:

1)在新启的线程中发送消息;

2)在主线程中获取和处理消息。

我们利用Handler的这两个作用,可以先在主线程中新建一条新的辅助线程,并且在这条新的线程中执行发送消息。这个消息就是我们通知系统,说现在需要更新UI界面了。如下:

new Timer().schedule(new TimerTask() {@Overridepublic void run() {handler.sendEmptyMessage(0x1233);}}, 0, 1000);

上面的代码重写了Handler的sendMessage(Message msg),不过在这里使用的是sendEmptyMessage(int what),因为这里只是通知主线程更新界面,没有过多的其他操作,所以只需要发送一条空的消息即可。若是更新的内容比较多或是一些其它的限制不能只发送一条空消息就能解决,那就应该发送一些有实质内容的东西,而这咱消息内容是Object的类型。对于Object这种类型的消息,是一个很宽泛的类型,它能装载的内容太多了。这个时候需要使用sendMessage(Message msg)。废话有点多,见谅。。。

那么当主线程拿到这条消息时,就会对其进行处理:

Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {if (msg.what == 0x1233) {((ImageView) findViewById(R.id.imageView1)).setImageResource(imageId[(currentImg++) % imageId.length]);}}};

以上就是简单地使用Handler来处理UI线程不安全问题。具体的代码实现还有不发送空消息来更新界面的代码以及AsyncTask的代码,我会在下面的给出连接。

-------------------------------------------------------------------------------------------------------------------------------------------------------

下面我们再来看看异步任务(AsyncTask)的简单用例。

使用AsyncTask需要有如下三个步骤:

1)创建AsyncTask的子类,并为其三个泛型参数指定类型。如果某个泛型参数不需要指定类型,则用void代替;

2)根据需要,实现AsyncTask的以下几个方法:

Ⅰ.doInBackground(Params...)这个方法,就是AsyncTask子类执行异步任务内容的方法;

Ⅱ.onProgressUpdate(Progress...)这个方法,会在执行完上一个方法后,被调用;

Ⅲ.onPreExecute()这个方法会在我们执行费时操作之前被调用,用于处理一些准备工作,如初始进度条什么的;

Ⅳ.onPostExecute()当doInBackground()执行完成之后,系统会自动调用该方法,并把doInBackground()执行的结果返回给该方法。

3)最后一步就是,我们在主线程中调用AsyncTask实例的execute(Params ... param)方法,表示开始执行费时操作。

如下代码:

class DownTask extends AsyncTask<URL, Integer, String> {// 可变长的输入参数,与AsyncTask.exucute()对应ProgressDialog pdialog;// 定义记录已经读取行的数量int hasRead = 0;Context mContext;public DownTask(Context ctx) {mContext = ctx;}@Overrideprotected void onPreExecute() {pdialog = new ProgressDialog(mContext);pdialog.setTitle("任务正在执行中");pdialog.setMessage("任务正在执行中,敬请等待...");// 设置对话框不能用“取消”按钮关闭pdialog.setCancelable(false);// 设置该进度条的最大进度值pdialog.setMax(202);// 设置对话框的进度条风格pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);// 设置对话框的进度条是否显示进度pdialog.setIndeterminate(false);pdialog.show();}@Overrideprotected String doInBackground(URL... params) {StringBuilder sb = new StringBuilder();try {URLConnection conn = params[0].openConnection();// 打开conn连接对应的输入流,并将它包装成BufferedReaderBufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));String line = null;while ((line = br.readLine()) != null) {sb.append(line + "\n");hasRead++;publishProgress(hasRead);}return sb.toString();} catch (Exception e) {e.printStackTrace();}return null;}@Overrideprotected void onProgressUpdate(Integer... values) {// 更新进度show.setText("已经读取了【" + values[0] + "】行!");pdialog.setProgress(values[0]);}@Overrideprotected void onPostExecute(String result) {// 返回HTML页面的内容show.setText(result);pdialog.dismiss();}}

关于Handler和AsyncTack的使用就简单介绍到这里。 本篇博客主要参考资料是《疯狂Android讲义》第3章内容。

----------------------------------------------------------点击进行源码的下载连接 -----------------------------------------------------------

Android中使用Handler和异步任务(AsyncTack)来为UI线程执行费时操作相关推荐

  1. 浅谈Android中的Handler机制

    Handler是Android中提供的一种异步回调机制,也可以理解为线程间的消息机制.为了避免ANR,我们通常会把一些耗时操作(比如:网络请求.I/O操作.复杂计算等)放到子线程中去执行,而当子线程需 ...

  2. 【Framework】透视Android中的Handler

    准备对基于Android应用开发Framework层的内容进行学习回顾,学习一个新技术前我们一般都会灵魂三问:What-Why-How(是什么.为什么.怎么用).源码的学习一定要亲自去看,用IDE或者 ...

  3. Android中有关Handler的总结

    Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.Android利用Handler来实现UI线程的更新的. Handler是Android中的消息发送器,其在哪个Activit ...

  4. 在Android中使用Handler和Thread线程执行后台操作

    在 Android中使用Handler和Thread线程执行后台操作 对于线程的控制,我们将介绍一个 Handler类,使用该类可以对运行在不同线程中的多个任务进行排队,并使用Message和Runn ...

  5. Android中的Handler的具体用法

    Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.Android利用Handler来实现UI线程的更新的. Handler是Android中的消息发送器,其在哪个Activit ...

  6. Android中的Handler总结

    一.Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控 ...

  7. android 多个handler,Android中的Handler与多线程应用实例

    本文首先解释一下handler是用来干嘛的,然后通过例子介绍其在多线程中的应用. 什么是Handler handler通俗一点讲就是用来在各个进程之间发送数据的处理对象.在任何进程中,只要获得了另一个 ...

  8. Android中对Handler用法的总结

    Android之Handler用法总结 方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用 ...

  9. android中handler机制,如何使用?,Android中的Handler机制

    一.Handler概述 二.Handler发送消息的方法 三.MessageQueue的enqueueMessage() 四.Message的when字段 五.子线程中使用Handler 六.Loop ...

最新文章

  1. java中batch基础_详解Spring batch 入门学习教程(附源码)
  2. 爬虫之xml和html的区别
  3. O365(世纪互联)SharePoint 之站点个性化
  4. 从程序语言排行榜来解读IT及Web的发展
  5. 即时通讯 TCP UDP
  6. 【干货】从用户体验谈产品经理如何提升团队协作能力
  7. c语言项目为什么要build?(gcc、makefile、cmake(qmake)、CMakeLists.txt)(qmake、cmake、qbs区别解析)(qmake还是cmake,mingw作用)
  8. 教学目标四个维度_挖掘教材 预设目标 思本归真—— 记临安区初二英语教学研讨会...
  9. Scala中任意表达式都是有返回值的(具体返回结果的值取决于满足条件的代码体的最后一行内容)
  10. boost::tti模块测试函数模板
  11. Boost:boost::asio模块的引用计数测试程序
  12. Lesson 31-32 Personal Habits
  13. 郑州志泽网络科技--SSH模拟试题
  14. C#整理1——进制转换
  15. MyBatis自学(5):延迟加载
  16. FFT(FastFourier Transform,快速傅立叶变换)
  17. tomcat source code in eclipse
  18. H5网页实现微信分享,分享朋友圈功能(分享带图片,附源码)
  19. C++ fstream详解
  20. swift - enumerated()

热门文章

  1. C++ Primer 5th笔记(chap 12 动态内存)allocator类
  2. C++ Primer 5th笔记(8)chapter8 类:IO库-string流
  3. DjangoRestFramework基本使用
  4. Fabric--configtxlator转换配置添加组织到channel
  5. python里graphics的使用_使用graphics.py实现2048小游戏
  6. cve-bin-tool 证书错误的解决方法
  7. 使用 _tprintf 宏兼容多字节字符集和Unicode字符集
  8. 某CMSV1.0代码审计
  9. Windows内存管理学习笔记(一)—— 线性地址的管理
  10. 开源一个ShellCode生成框架