浅析 - Android异步操作
来源:互联网 发布:windows r 编辑:程序博客网 时间:2024/04/28 05:52
尊重每个人的付出,转载请点这里:http://blog.csdn.net/hanj456/article/details/52347976
异步操作
要点:理解thread,handle,runnable,message,looper的作用以及它们之间的关系。
什么是异步操作?简单来说就是在主线程中新开线程进行的操作; 为什么需要异步操作?大家知道Android设计的时候是不允许在UiThread之外进行UI操作的,同时也不允许在主线程内执行耗时操作,但是这些都是开发中经常会遇到的问题,那么怎么解决这一点呢?这就涉及到下面提到的几个概念: thread:android中线程的意思,它是CPU调度资源的基本单位,执行所有的动作 ; runnable:一个接口,里面只有一个抽象方法run(); message:android中的消息处理机制中的一员,用来传递数据; looper:专门用来操作操作message的,它和主线程是相互绑定的; handle:可以把它理解为子线程和Looper之间的桥梁; 弄清楚这几个概念就不难发现Android是怎么完成主线程只负责UI操作,子线程负责耗时操作的分工的:首先当主线程MainThread中需要进行耗时操作的时候新开一条子线程childThread,而childThread的操作是在runnable接口中run()方法里实现的,完成之后需要将结果传递到主线程,这时候想到了Looper和message,但使用它们需要借助handle这个桥梁,于是我们就通过handle来操作Looper将子线程中的数据封装到message中传递到主线程了。
使用示例:
Handle handle = new Handle();new Thread(new Runnable(){ @Override public void run() { final Bitmap bitmap = downloadImage(imageUrl); handle.post(new Runnable(){ public void run() { mIv.setImageBitmap(bitmap); } }); }}).start();
以上是异步操作的一个基本思路,像Android提供的runOnUiThread()方法其实就是讲handle这一步进行了封装,简化了一点操作步骤。但是这个方法还有一些缺陷,那就是如果只是一两个子线程没问题,但如果是需要新开一百条线程,那系统就吃不消了,为了解决所线程任务的需求,就引出一个新的概念:线程池(ThreadPool)。
什么是线程池?简单来说就是对线程的一个封装,线程池中由多个线程,当一个线程使用完后就放回线程池中,后面再次需要这个线程的时候重新取出来进行利用,避免了重复创建线程带来的额外开销,也方便了线程的统一管理。对于这种多线程的异步任务操作,Android为我们提供了一个封装好了线程池的类AsyncTask,将创建线程池和对线程池的管理过程都封装起来,我们只需要在onPostExecute()方法中执行对UI的操作,在doInBackground()方法中执行耗时操作就行,结构很简单。
使用示例:
new AsyncTask<String,Void,Bitmap>(){ @Override protected Bitmap doInBackground(String... params) { return downloadImage(params[0]); } @Override protected void onPostExecute(Bitmap bitmap) { mIv.setImageBitmap(bitmap); } }.execute(imageUrl);
0 0
- 浅析 - Android异步操作
- 浅析C#异步操作
- 浅析 Android操作HTTP
- Android异步操作AsyncTask
- Android AsyncTask异步操作
- Android 异步操作AsyncTask
- Android 异步操作AsyncTask
- Android异步操作 AsyncTask
- Android 异步操作AsyncTask
- Android 异步操作AsyncTask
- android异步操作
- Android异步操作总结
- Android异步操作总结
- Android笔记-异步操作
- Android AsyncTask异步操作
- android - AsyncTask 异步操作
- android 异步操作总结
- Android 异步操作AsyncTask
- 389. Find the Difference
- 高效使用google及提问
- Fedora 下搭建Lampp开发环境
- C#控制台基础 用do-while循环限制用户只能输入yes或者no
- Java同步容器与并发容器
- 浅析 - Android异步操作
- hibernate date mysql 时间段查询
- 对象转型2 /java初学
- CharSequence类型
- Android SwipeRefreshLayout 官方下拉刷新控件介绍
- 问题及解决方案-面试及经验增长
- 阅读Android官方教程 Google Training 1.2 ------ Supporting Different Devices
- 用Springmvc做一个小小的登录检测
- 几种内存的分配方式