由于主线程(也可叫UI线程)负责处理用户输入事件(点击按钮、触摸屏幕、按键等),如果主线程被阻塞,应用就会报ANR错误。为了不阻塞主线程,我们需要在子线程中处理耗时的操作,在处理耗时操作的过程中,子线程可能需要更新UI控件的显示,由于UI控件的更新重绘是由主线程负责的,所以子线程需要通过Handler发送消息到主线程的消息队列中,由运行在主线程的消息处理代码接收到消息后更新UI控件的显示。
采用线程+Handler实现异步处理时,当每次执行耗时操作都创建一条新线程进行处理,性能开销会比较大。另外,如果耗时操作执行的时间比较长,就有可能同时运行着许多线程,系统将不堪重负。为了提高性能,我们可以使用AsyncTask实现异步处理,事实上其内部也是采用线程+Handler来实现异步处理的,只不过是其内部使用了线程池技术,有效地降低了线程创建数量及限定了同时运行的线程数。
public class UpdateTask extends AsyncTask<String, Integer, String>{
protected void onPreExecute() {//运行在UI线程
progressBar.setMax(100);
}
protected String doInBackground(String... params) {
return "something";
}
protected void onPostExecute(String result) {//运行在UI线程
Toast.makeText(getApplicationContext(), "结果 :"+ result, 1).show();
}
protected void onProgressUpdate(Integer... values) {//运行在UI线程
progressBar.setProgress(values[0]);
}
}
启动异步处理工作(下面两句代码需要在主线程里执行):
UpdateTask task = new UpdateTask();
task.execute(“liming”,“zhangxx”); //这里输入的参数会传给doInBackground()方法
停止异步处理工作:
if (task != null && task.getStatus() == AsyncTask.Status.RUNNING) {
task.cancel(true);//如果Task还在运行,则先取消它
task = null;
}
public class UpdateTask extends AsyncTask<String, Integer, String>{
protected void onPreExecute() {
progressBar.setMax(100);
}
protected String doInBackground(String... params) {
for(int i = 0 ; i < 100; i++){
this.publishProgress(i+1);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(isCancelled()) return null;
}
return "something";
}
protected void onPostExecute(String result) {
Toast.makeText(getApplicationContext(), "结果 :"+ result, 1).show();
}
protected void onProgressUpdate(Integer... values) {
progressBar.setProgress(values[0]);
}
}
AsyncTask类的三个泛型参数:
第一个指定了doInBackground() 方法输入参数的类型;
第二个指定了onProgressUpdate()方法输入参数的类型;
第三个指定了onPostExecute()方法输入参数的类型和doInBackground() 方法返回值的类型
这三个泛型参数的类型是根据你自己的业务需求来指定的。
onPreExecute(): 该方法在UI线程运行,当AsyncTask的execute()方法执行后,onPreExecute()会首先执行。可以在该方法中做一些准备工作,如初始化进度条的最大值。
doInBackground(Params...): 将在onPreExecute()方法执行后马上执行,该方法运行在子线程中,负责执行耗时操作。在执行耗时操作的过程中你可以不断地调用publishProgress()方法,导致onProgressUpdate()不断地被调用。
onProgressUpdate(Progress...),调用publishProgress()方法,就会导致该方法被执行,该方法运行在UI线程,例如在该方法中你可以更新进度条的显示。
onPostExecute(Result):doInBackground()方法执行后的返回结果会传给该方法,该方法运行在UI线程,在该方法中你可以显示处理结果。
分享到:
相关推荐
总的来说,`AsyncTask`是Android中实现简单异步操作的有效工具,特别是对于轻量级的网络请求和计算任务。然而,对于更复杂的多线程需求,如大量的并发任务或复杂的任务协调,开发者可能需要考虑使用`IntentService`...
总之,AsyncTask为Android开发者提供了一种简洁的方式,处理耗时操作和UI更新,使得异步编程更加直观和易于管理。但要注意,随着Android版本的更新,对于大型或者复杂的异步任务,推荐使用更现代的解决方案,如`...
综上所述,虽然`AsyncTask`在早期的Android开发中广泛使用,但随着Android平台的演进,开发者应逐渐转向更现代的异步处理机制,以提高应用的稳定性和性能。不过,理解`AsyncTask`的工作原理仍然是了解Android多线程...
在Android应用开发中,异步处理是至关重要的,特别是在涉及到耗时操作如网络请求、数据库操作或文件I/O时。Android提供了一种便捷的机制,名为`AsyncTask`,用于在后台线程执行这些任务,同时允许在主线程更新UI。`...
这个博文主要围绕Android开发中的AsyncTask展开,讨论了如何利用它来异步处理任务。 AsyncTask是Android提供的一个轻量级异步处理框架,适用于快速、简短的后台任务,例如网络请求、数据库操作等。它的核心设计思想...
Handler和AsyncTask是实现异步加载的两种常见方式,除此之外,还可以使用Loader、IntentService、Retrofit+OkHttp等工具或框架。 **对比与选择:** - Handler适合处理周期性的、连续的任务,如定时刷新UI,或者需要...
Android异步处理二:使用AsyncTask异步更新UI界面。
"Android AsyncTask实现异步处理任务的方法详解" Android AsyncTask是Android操作系统提供的一个工具类,用于实现异步处理任务的方法详解。AsyncTask是抽象类,定义了三种泛型类型 Params,Progress和Result。...
Android异步任务AsyncTask使用解析是指在Android应用程序中使用AsyncTask来实现异步任务的处理。AsyncTask是一个抽象类,使用时需要继承这个类,然后调用execute()方法。AsyncTask主要用来更新UI线程,比较耗时的...
本篇文章将深入探讨如何在Android中使用`AsyncTask`来异步加载网络图片。 首先,我们了解`AsyncTask`的基本结构。`AsyncTask`有三个泛型参数:`Params`, `Progress`, 和 `Result`。在本例中,`Params`通常是网络...
`AsyncTask`是Android提供的一种轻量级的异步处理机制,它可以简化在主线程与工作线程之间的数据同步。在本例中,我们将深入探讨如何使用`AsyncTask`实现断点续传功能。 断点续传是一种允许用户在任意位置继续下载...
AsyncTask的使用及ListView的常见优化 asyncTask异步加载数据 使用了LruCache优化图片加载 通过滑动监听提高ListView滑动流畅度.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习...
本篇文章将深入探讨Android的AsyncTask异步任务,以及如何在实践中应用。 首先,Android是一个基于事件驱动的系统,主线程(UI线程)负责处理用户交互,而复杂的计算或网络请求等耗时操作应在后台线程中执行,以免...
在Android开发中,异步...总之,理解并熟练使用Android AsyncTask对于Android开发者来说至关重要,但也要根据项目需求选择最适合的异步处理方式。在实际开发中,我们应灵活运用各种工具,确保应用的性能和用户体验。
在Android平台上,录音功能是通过`MediaRecorder`类来实现的,而将录制的音频文件上传到服务器通常采用网络请求库,如OkHttp或Volley,配合`AsyncTask`进行异步处理,以避免阻塞主线程。下面,我们将详细讨论这些...
AsyncTask_简单演示AsyncTask异步操作,写一个简单的AsyncTask异步操作解决上一篇文章提到的线程阻塞问题,对应我的博客《网易博客迁移:Android专题之AsyncTask(二)简单演示AsyncTask异步操作》,有问题欢迎留言...
总结,`Android用AsyncTask异步加载图片`涉及到的关键技术点包括:`AsyncTask`的生命周期、后台线程执行、UI线程更新、图片的网络加载以及进度条的控制。通过合理运用这些技术,可以提高应用的响应速度,提升用户...
在提供的资源中,"android录音上传到服务器,上传使用AsyncTask异步任务.rar" 提到了使用AsyncTask来处理这一问题。下面,我们将深入探讨Android系统中的这些功能及其与AsyncTask的结合使用。 1. **拍照上传**: ...