Android-异步加载AsynsTask

我们知道,在Android中,只有UI线程能够更新UI,而子线程是不能更新UI。但是如果某个应用需要进行某种耗时的操作,如果在UI线程进行此操作的话,那会显得应用程序非常的卡顿,这个是不能允许存在的。于是,我们想到了使用子线程来进行这些耗时的操作,但是由于子线程不能更新UI,所以我们并不知道什么时候应该更新UI。

为了解决这个问题,Android出现了异步加载,而AsyncTask就是这个用途。

1.构建AsyncTask子类的参数

AsyncTask<Params, Progress. Result>是一个抽象类,通常用来被继承,继承AsyncTask需要指定如下三个泛型参数的:

A.Params:启动任务时输入参数的类型

B.Progress:后台任务执行中返回进度值的类型

C.Result:后台任务完成后返回结果的类型

2.构建AsyncTask子类的回调方法

A.doInBackGround:必须重写,子线程在这个方法里面进行耗时操作

B.onPreExecute:执行后台耗时操作前被调用,通常在方法里面进行一些初始化的操作

C.onPostExecute:当doInBackground完成后,系统会自动调用这个方法,并且将doInBackground方法返回的值传给该方法

D.onProgressUpdate:在doInBackground方法中调用publishProgress方法时,更新任务的执行进度后,会触发这个方法

 3.使用AsyncTask来加载网络图片

 1 class MyAsyncTask extends AsyncTask<String, Void, Bitmap>
 2     {
 3
 4         @Override
 5         protected Bitmap doInBackground(String... params) {
 6             try {
 7                 Thread.sleep(3000);
 8             } catch (InterruptedException e) {
 9                 e.printStackTrace();
10             }
11             Bitmap bitmap = null;
12             String urlString = params[0];
13             URLConnection urlConnection = null;
14             InputStream is = null;
15             URL url = null;
16             try {
17                 url = new URL(urlString);
18                 urlConnection = url.openConnection();
19                 is = urlConnection.getInputStream();
20                 BufferedInputStream bis = new BufferedInputStream(is);
21                 bitmap = BitmapFactory.decodeStream(bis);
22             } catch (MalformedURLException e) {
23                 e.printStackTrace();
24             } catch (IOException e) {
25                 e.printStackTrace();
26             }
27             return bitmap;
28         }
29
30         @Override
31         protected void onPreExecute() {
32             super.onPreExecute();
33             mProgressBar.setVisibility(View.VISIBLE);
34         }
35
36         @Override
37         protected void onPostExecute(Bitmap bitmap) {
38             super.onPostExecute(bitmap);
39             mProgressBar.setVisibility(View.GONE);
40             mImageView.setImageBitmap(bitmap);
41         }
42     }

在AsynsTask中, 只有doInBackground运行在子线程,其他方法都在主线程当中,所以其他方法可以对UI进行操作

在这里,我们使用了Java的流操作,自己对流的操作不是很熟悉,所以在这里提醒一下自己

4.模拟进度条的更新

 1 class MyAsyncTask extends AsyncTask<Void , Integer, Void>
 2     {
 3
 4         @Override
 5         protected Void doInBackground(Void... params) {
 6             for(int i = 0; i < 100; i++)
 7             {
 8                 if(isCancelled())
 9                 {
10                     return null;
11                 }
12                 publishProgress(i);
13                 try {
14                     Thread.sleep(300);
15                 } catch (InterruptedException e) {
16                     e.printStackTrace();
17                 }
18             }
19             return null;
20         }
21
22         @Override
23         protected void onProgressUpdate(Integer... values) {
24             super.onProgressUpdate(values);
25             if(isCancelled())
26             {
27                 return;
28             }
29             mProgressBar.setProgress(values[0]);
30         }
31     }
32
33     @Override
34     protected void onPause() {
35         super.onPause();
36         if(myAsyncTask != null && myAsyncTask.getStatus() == AsyncTask.Status.RUNNING)
37         {
38             myAsyncTask.cancel(true);
39         }
40     }
时间: 2024-10-05 14:20:32

Android-异步加载AsynsTask的相关文章

Android异步加载全解析之Bitmap

Android异步加载全解析之Bitmap 在这篇文章中,我们分析了Android在对大图处理时的一些策略--Android异步加载全解析之大图处理  戳我戳我 那么在这篇中,我们来对图像--Bitmap进行一个更加细致的分析,掌握Bitmap的点点滴滴. 引入 Bitmap这玩意儿号称Android App头号杀手,特别是3.0之前的版本,简直就是皇帝般的存在,碰不得.摔不得.虽然后面的版本Android对Bitmap的管理也进行了一系列的优化,但是它依然是非常难处理的一个东西.在Androi

Android异步加载全解析之开篇瞎扯淡

Android异步加载 概述 Android异步加载在Android中使用的非常广泛,除了是因为避免在主线程中做网络操作,更是为了避免在显示时由于时间太长而造成ANR,增加显示的流畅性,特别是像ListView.GridView这样的控件,如果getView的时间太长,就会造成非常严重的卡顿,非常影响性能. 本系列将展示在Android中如何进行异步加载操作,并使用ListView来作为演示的对象. 如何下载图像 下载自然是需要使用网络,使用网络就不能在主线程,在主线程就会爆炸.所以我们必须要在

Android异步加载全解析之使用多线程

异步加载之使用多线程 初次尝试 异步.异步,其实说白了就是多任务处理,也就是多线程执行,多线程那就会有各种问题,我们一步步来看,首先,我们创建一个class--ImageLoaderWithoutCaches,从命名上,大家也看出来,这个类,我们实现的是不带缓存的图像加载,不多说,我们再创建一个方法--showImageByThread,通过多线程来加载图像: /** * Using Thread * @param imageView * @param url */ public void sh

Android异步加载全解析之使用AsyncTask

Android异步加载全解析之使用AsyncTask 概述 既然前面提到了多线程,就不得不提到线程池,通过线程池,不仅可以对并发线程进行管理,更可以提高他们执行的效率,优化整个App.当然我们可以自己创建一个线程池,不过这样是很烦的,要创建一个高效的线程池还是挺费事的,不过,Android系统给我吗提供了AsyncTask这样一个类,来帮助我们快速实现多线程开发,它的底层实现,其实就是一个线程池. AsyncTask初探 AsyncTask,顾名思义就是用来做异步处理的.通过AsyncTask,

Android异步加载全解析之大图处理

Android异步加载全解析之大图处理 异步加载中非常重要的一部分就是对图像的处理,这也是我们前面用异步加载图像做演示例子的原因.一方面是因为图像处理不好的话会非常占内存,而且容易OOM,另一方面,图像也比文字要大,加载比较慢.所以,在讲解了如何进行多线程.AsyncTask进行多线程加载后,先暂停下后面的学习,来对图像的异步处理进行一些优化工作. 为什么要对图像处理 为什么要对图像进行处理,这是一个很直接的问题,一张图像,不管你拿手机.相机.单反还是什么玩意拍出来,它就有一定的大小,但是在不同

Android异步加载

Android异步加载 一.为什么要使用异步加载? 1.Android是单线程模型 2.耗时操作阻碍UI线程 二.异步加载最常用的两种方式 1.多线程.线程池 2.AsyncTask 三.实现ListView图文混排 3-1 实现读取网页中的json数据到ListView中 (图片首先为默认图片) 3.1.1:主布局只有一个ListView和一个listView_item的布局 3.1.2:网页json数据的链接(http://www.imooc.com/api/teacher?type=4&n

Android异步加载全解析之引入一级缓存

Android异步加载全解析之引入缓存 为啥要缓存 通过对图像的缩放,我们做到了对大图的异步加载优化,但是现在的App不仅是高清大图,更是高清多图,动不动就是图文混排,以图代文,如果这些图片都加载到内存中,必定会OOM.因此,在用户浏览完图像后,应当立即将这些废弃的图像回收,但是,这又带来了另一个问题,也就是当用户在浏览完一次图片后,如果还要返回去再进行重新浏览,那么这些回收掉的图像又要重新进行加载,保不准就要那些无聊到蛋疼的人在那一边看你回收GC,一边看你重新加载.这两件事情,肯定是互相矛盾的

Android异步加载全解析之IntentService

Android异步加载全解析之IntentService 搞什么IntentService 前面我们说了那么多,异步处理都使用钦定的AsyncTask,再不济也使用的Thread,那么这个IntentService是个什么鬼. 相对与前面我们提到的这两种异步加载的方式来说,IntentService有一个最大的特点,就是--IntentService不受大部分UI生命周期的影响,它为后台线程提供了一个更直接的操作方式.不过,IntentService的不足主要体现在以下几点: 不可以直接和UI做

演化理解 Android 异步加载图片

图片加载的几种方法如下: 下面测试使用的layout文件: 简单来说就是 LinearLayout 布局,其下放了5个ImageView. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical

Android异步加载网络图片

Android图片的异步加载,主要原理: 加载图片时先查看缓存中时候存在该图片,如果存在则返回该图片,否则先加载载一个默认的占位图片,同时创建一个通过网络获取图片的任务并添加,任务完成后放松消息给主线程更新界面. 使用方法: [java] view plain copy AsynImageLoader asynImageLoader = new AsynImageLoader(); asynImageLoader.showImageAsyn(imageView, imageUrl, resId)