- 浏览: 559301 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
北月与南安:
哥哥不要秀我,答案是11.38,你算出来36.43,要求N个点 ...
平均距离 -
xiao_android_jun:
[color=red][ size=xx-small ...
Android 之 进程的概念介绍 -
明子健:
小伙子,很有前途哦
《将博客搬至CSDN》 -
1140566087:
dugujiujian 写道R.layout.simple_s ...
Android 之 下拉(Spinner) 组件示例 -
dugujiujian:
R.layout.simple_spinner_dropdow ...
Android 之 下拉(Spinner) 组件示例
Android 中AsyncTask 的使用
1、首先我们来看看AsyncTask 的介绍:
Handler 和 AsyncTask 都是android 中用来实现异步任务处理的方式;其中:
Handler 实例向 UI 线程发送消息,完成界面更新,
优点:对整个过程控制的比较精细;
缺点:代码相对臃肿,多个任务同时执行时,不易对线程进行精确的控制;
AsyncTask :比Handler 更轻量级一些,适用于简单的异步处理;
优点:简单 | 快捷 | 过程可控;
缺点:使用多个异步操作时就变得复杂起来;
2、AsyncTask 的定义:(AsyncTask 定义了三种泛型类型)
public abstract class AsyncTask<Params,Progress,Result>{...}
说明:
Params :启动任务执行的输入参数,例如:HTTP 请求的URL;
Progress: 后台任务执行的百分比;
Result:后台执行任务最终返回的结果,比如String;
3、AsyncTask 异步任务的执行步骤:(以下方法除execute(Params... params),在AsyncTask中重写),下列是相关方法的介绍:
A、execute(Params... params) :
执行一个异步任务,需要我们在UI线程中调用,触发任务
B、OnPreExecute():
execute(Params... params)调用后立即执行,一般用于在执行后台任务前对UI做一些标记; 例如,可以在此处显示进度对话框;
C、doInBackground(Params.. params):
onPreExecute() 完成后执行,后台执行,处理比较耗时的操作;此处不能操作UI,执行的过程中调用publishProgress(Progress... values)来更新进度信息;
D、onProgressUpdate(Progress... values):
在调用publicshProgress(Progress... values)方法执行,直接将进度信息更新到UI组建上;此方法在主线程上执行,用于显示任务执行的进度;
E、onPostExecute(Result result):
此方法在主线程中执行,当后台的操作结束时,此方法会被调用,计算结果作为参数传递到此方法中,直接将结果显示到UI组建上。
F、cancel(); :
取消一个正在执行的任务,在UI线程中完成,用AsyncTask的对象进行调用,参数为true/false;
4、使用AsyncTask 时注意事项:
A、异步任务实例必须在UI线程中创建;
B、execute(Params... params) 方法必须在UI线程中调用;
C、不要手动的调onPreExecute().doInBackground().onProgressUpdate().onPostExecute()这几个方法;
D、不能在doInBackground(Params... params) 中更改组件信息;
E、一个任务实例只能执行一次,如果执行第二次会抛出异常;
5、案例:使用AsyncTask 实现图片的下载:
Activity类,主程序的入口:
public class MainActivity extends Activity { // 程序入口 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyAsyncTask my = new MyAsyncTask(); my.execute("http://photocdn.sohu.com/20110927/Img320705637.jpg"); } }
AsyncTask 派生类,实现异步任务:
package com.sun.asynctask; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import org.apache.http.HttpConnection; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.util.Log; /** * 异步任务,实现网页内容的获取 * * * 生成该类的对象,并调用execute方法之后 * * 首先执行的是onProExecute() 方法, * * 其次执行的doInBackground()方法 */ public class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> { /** * 在execute() 方法执行后立即执行,运行在UI线程中, * 在后台任务开始前执行,用于标识UI界面 */ protected void onPreExecute() { super.onPreExecute(); Log.i("msg","onPreExecute()..."); } /** * 后台执行耗时的任务; * * 方法中的 String 参数对应 AsyncTask的第一个参数; * 返回的 Bitmap 对应的是AsyncTask 的第三个参数; * * 该方法并不运行在UI线程中,主要用于异步操作,可以调用publishProgress()方法触发 * onProgressUpdate对UI进行操作; * */ protected Bitmap doInBackground(String... params) { Log.i("msg","doInBackground(String... params)..."); try { /* 网络访问方式 二 */ /* URL url = new URL(params[0]); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); connection.connect(); // 开始连接 int zong = connection.getContentLength(); InputStream is2 = connection.getInputStream(); */ /* 开始网络访问数据 */ HttpGet hg = new HttpGet(params[0]); // 此处注意参数的用法 HttpClient hc = new DefaultHttpClient(); HttpResponse hr = hc.execute(hg); // 发送请求,得到响应 // 判断请求是否成功 if(hr.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ Log.i("msg", "access success..."); HttpEntity he = hr.getEntity(); InputStream is = he.getContent(); // 获取输入流对象,好比搭桥 long total = he.getContentLength(); // 文件的总字节数 ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 输出流,临时容器,用于装从is中流出的数据 byte[] buffer = new byte[1024]; // 缓存容器,每次装载1024 个字节数据 int len = 0; // 每次读的字节数 int curLen = 0 ; // 已读多少数据 while((len=is.read(buffer))!=-1){ // 当len !=-1 时,也就是还有数据可读 Log.i("msg","begin read data..."+len+",total:"+total); baos.write(buffer, 0, len); // 向临时容器中装数据 curLen=curLen+len; // 更新已读的数据 /* 在UI显示当前读取的进度 , 调用次方法触发onProgressUpdate() 方法执行 */ publishProgress((int)(((float)curLen/total)*100)); } Bitmap bitmap = BitmapFactory.decodeByteArray(baos.toByteArray(), 0, (int)total); is.close(); return bitmap; } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 括号中的参数:String 对应的是AsyncTask 的第三个参数,也就是 * 接收了 从doInBackground() 返回的结果; * 此方法在 doInBackground() 方法执行结束后执行,运行在UI线程中, * 可以对UI进行更新 */ protected void onPostExecute(Bitmap result) { super.onPostExecute(result); Log.i("msg","onPostExecute(String result)..."+result.getHeight()); } /** * 方法括号中的Integer 对应AsyncTask 中的第二个参数; * 在doInBackground() 中每次调用publishProgress() 时被执行; * 该方法是在UI线程中的,所以可以用于对UI进行更新 */ protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); Log.i("msg","onProgressUpdate(Integer... values)..."+values[0]); } /** * 图片的下载 */ public HttpURLConnection downPic(String urltemp){ try { URL url = new URL(urltemp); // 确定连接地址 // 打开一个连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.connect(); // 开始连接 return connection; } catch (Exception e) { e.printStackTrace(); } return null; } }
发表评论
-
Android 之 网络访问服务器,解析JSON数据
2014-03-28 22:50 3418提示:在访问网络,或者服务器的数据一定要注意 网络权限的声明: ... -
Android 之 Looper Handler Message 之间的关系
2014-03-19 10:16 3666Android 的消息 ... -
Android 之 多线程与Socket联合使用案例
2014-03-19 10:15 2673多线 ... -
Android 之 多线程和Socket套接字的使用介绍
2014-03-19 10:15 4885And ... -
Android 之 实现Runnable 接口与继承Thread的区别
2014-03-19 10:15 2199实现Runnable 接口 相 ... -
Android 之 GSON解析JSON数据
2014-03-19 10:14 4493... -
Android 之 使用Pull 解析xml文件
2014-03-18 21:04 1045/** * 使用Pull进行 xml 文件的解析 ... -
Android 之 使用DOM解析xml文件
2014-03-18 21:02 2745DOM 解析 xml 格式的文件 1、 xml简介:xml ... -
Android 之 百度API 密钥安全码生成
2014-03-04 22:29 2413近期要做个关于旅游助手的应用,开始接触百度API了。大神们 ... -
Android 之 EditText属性用法介绍
2014-01-06 23:49 3991EditText的属性 EditText继承关系:View-- ... -
Android 之 自定义适配器
2014-01-08 10:40 1775自定义适配器 1、实现 * 自定义适配器要继承 BaseA ... -
Android 之 自定义控件用法介绍
2014-01-08 10:40 1720自定义效果:实现:图片和文字混合 首先创建需要组合的子布局: ... -
Android 之 资源自适应与国际化
2014-01-08 10:40 3081<!-- 国际化和资源自适应 ... -
Android 之 Parcelable 序列化
2014-01-08 10:41 2699/* 序列化 * * 作 ... -
Android 之 五大布局案例
2014-01-08 10:41 21331、LinearLayout 线性布局例子: <Lin ... -
Android 之 通知Notification
2014-03-03 22:30 3897Notification 和 NotificationMana ... -
Android 之 手机全屏显示
2014-03-03 22:30 2344/* 1、全屏状态的显示 介绍:Android 中提供了Wi ... -
Android 之 拦截手机短信并自动转发
2014-03-03 22:29 5436拦截短信和发送短信都需要相关的权限: <?xml ve ... -
Android 之 将RAW资源文件写入SD卡工具类
2014-03-01 10:09 3615package com.sun.coptfiletosd; ... -
Android 之 监控手机电量
2014-03-01 10:09 1797package com.example.battery; ...
相关推荐
本篇文章将深入探讨Android的AsyncTask异步任务,以及如何在实践中应用。 首先,Android是一个基于事件驱动的系统,主线程(UI线程)负责处理用户交互,而复杂的计算或网络请求等耗时操作应在后台线程中执行,以免...
总的来说,`AsyncTask`是Android中实现简单异步操作的有效工具,特别是对于轻量级的网络请求和计算任务。然而,对于更复杂的多线程需求,如大量的并发任务或复杂的任务协调,开发者可能需要考虑使用`IntentService`...
它的核心设计思想是简化多线程编程,将异步任务分为三个主要阶段:onPreExecute()、doInBackground()和onPostExecute()。 1. **onPreExecute()**: 这个方法在主线程中运行,通常用于初始化任务,例如显示进度...
android录音上传到服务器,上传使用AsyncTask异步任务,包含PHP服务器端,绝对能用。 就这个功能搞了 近2天,网上的内容都是同质化的,基本都是一个方式实现的 很郁闷,这个亲测绝对能用,不会用的 联系
`AsyncTask`是Android SDK提供的一种轻量级的异步任务处理类,它简化了在后台线程中执行任务并在UI线程中更新结果的过程。`AsyncTask`包含三个泛型参数:`Params`、`Progress`和`Result`,分别代表输入参数类型、...
总的来说,理解并熟练掌握Handler和AsyncTask是Android开发的基础,它们能帮助开发者有效地处理异步任务,提高应用的性能和用户体验。在实际开发中,根据具体场景选择合适的方法,同时关注Android API的变化,适时...
在提供的资源中,"android录音上传到服务器,上传使用AsyncTask异步任务.rar" 提到了使用AsyncTask来处理这一问题。下面,我们将深入探讨Android系统中的这些功能及其与AsyncTask的结合使用。 1. **拍照上传**: ...
在Android开发中,异步任务(AsyncTask)是一种常见的处理耗时操作的方式,尤其是在主线程中需要执行网络请求、数据库操作或大型数据处理时。它能够避免UI线程被阻塞,提供更好的用户体验。让我们深入了解一下`...
Android提供了一种便捷的机制,名为`AsyncTask`,用于在后台线程执行这些任务,同时允许在主线程更新UI。`AsyncTask`是一个轻量级的框架,设计用来简化在Android应用程序中进行后台操作的过程。 `AsyncTask`包含三...
本篇文章将深入探讨如何在Android中使用`AsyncTask`来异步加载网络图片。 首先,我们了解`AsyncTask`的基本结构。`AsyncTask`有三个泛型参数:`Params`, `Progress`, 和 `Result`。在本例中,`Params`通常是网络...
总结,`Android用AsyncTask异步加载图片`涉及到的关键技术点包括:`AsyncTask`的生命周期、后台线程执行、UI线程更新、图片的网络加载以及进度条的控制。通过合理运用这些技术,可以提高应用的响应速度,提升用户...
在提供的"AsyncTask异步任务三"示例中,你将找到一个详尽的教程,演示如何在Android项目中使用AsyncTask来加载数据。这将帮助初学者理解异步编程的基本概念,以及如何在Android应用中有效地实现异步任务。通过实践这...
`AsyncTask`是Android提供的一个轻量级的异步任务框架,非常适合用于这类场景。 `AsyncTask`类提供了三个泛型参数,它们分别是`Params`(输入参数类型)、`Progress`(后台执行过程中的进度类型)和`Result`(返回...
Android异步任务AsyncTask使用解析 Android异步任务AsyncTask使用解析是指在Android应用程序中使用AsyncTask来实现异步任务的处理。AsyncTask是一个抽象类,使用时需要继承这个类,然后调用execute()方法。...
这个压缩包文件"安卓Android源码——android录音上传到服务器,上传使用AsyncTask异步任务.rar"包含了一个示例,它演示了如何利用Android SDK提供的API来录制音频,并通过AsyncTask异步任务将其上传到服务器。...
在这个“一个AsyncTask异步任务的操作实例”中,我们将深入探讨AsyncTask的工作原理、使用方法以及如何在实际项目中应用。 1. **AsyncTask基本结构**: AsyncTask由三个泛型参数定义:`Params`, `Progress`, 和 `...
因为,UI线程主要是用来更新界面UI,如果一次进行太多的任务处理,并且这些任务需要相当的时间来完成,就会造成UI线程堵塞,结果可能是应用无响应(Android4.0以后,谷歌已经禁止在UI线程中进行“耗时操作”),这样的...
这个压缩包"android录音上传到服务器,上传使用AsyncTask异步任务.zip"显然包含了实现这一功能的代码示例。接下来,我们将深入探讨Android录音、文件存储以及使用AsyncTask进行异步任务处理的相关知识点。 1. **...
总之,这个压缩包中的源码实例为我们提供了一个Android录音上传到服务器的完整流程,包括使用`MediaRecorder`录制音频,通过AsyncTask异步上传文件。这不仅是一个学习Android音频处理和网络编程的好素材,也是一个...