安卓异步任务(2)

1、使用异步任务加载网络上的图片

我们可以打开这个网址:http://img1.3lian.com/img2011/07/20/05.jpg可以看到一副很好看的图片,我们就要把这个图片显示出来,首先,还是先要布局,我们要显示一幅图片,所以我们的布局中需要一个ImageView,布局很简单,一个ImageView就可以了:

  

 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout 3   xmlns:android="http://schemas.android.com/apk/res/android" 4   android:layout_width="match_parent" 5   android:layout_height="match_parent"> 6     <ImageView  7       android:id="@+id/img"  8       android:scaleType="fitXY" 9       android:layout_width="match_parent" 10       android:layout_height="match_parent"/>11 </LinearLayout>

 之后我们要写一个Activity显示这个图片,不过要加载网络上的图片,我们需要从一个URL的流中获取这个图片,所以我们要写一个方法来获取这张图片:

  

1 public Drawable loadImages(String url) { 2         try {3             return Drawable.createFromStream((InputStream)(new URL(url)).openStream(), "test");4         }5         catch (IOException e) {6             e.printStackTrace();7         }8         return null;9     }

  从URL中打开流,强制转换成InputStream,然后从流中拿到Drawable。

  既然可以获取图片了,我们要考虑一个问题,如果图片很大,加载的很慢怎么办,我们岂不是要等很久?不要紧,这时候我们就可以用异步任务了。

  首先我们要写一个内部类,这个类部类是继承自异步任务的,需要重载里面的doBackGround方法:

  

 1  private class ImageAsynTask extends AsyncTask<Void, Void, Drawable> { 2  3         @Override 4         protected Drawable doInBackground (Void... params) { 5             String url = "http://img1.3lian.com/img2011/07/20/05.jpg"; 6             return loadImages(url); 7         } 8          9         @Override10         protected void onPostExecute (Drawable result) {11             super.onPostExecute(result);12             mDialog.dismiss();13             mImage.setImageDrawable(result);14         }15         16         @Override17         protected void onPreExecute () {18             super.onPreExecute();19             mDialog.show();20         }21     }

 首先看这个方法:onPreExecute()这个方法是在doInBackGround前面执行。我们把这个方法写出来,我们需要在获取图片之前等待的时间里,写一个progressDialog,显示出来,提示用户,目前正在加载图片,需要等待一段时间。同时在后台操作doBackGround运行。

  在doBackGround完成之后就会执行onPostExecute(Drawable result)方法,看这个方法就知道,必须在doBackGround完成之后,把得到的结果Drawable作为参数传到onPostExecute方法里面去,执行这个方法就表示已经加载完了,我们需要将progressDialog消失掉,然后把图片显示出来就可以了,整个过程很简单。

  看下整个Activity的代码:

  

 1 package com.test.asyntask; 2  3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.net.URL; 6  7 import android.app.Activity; 8 import android.app.ProgressDialog; 9 import android.graphics.drawable.Drawable;10 import android.os.AsyncTask;11 import android.os.Bundle;12 import android.widget.ImageView;13 14 import com.test.R;15 16 public class AsynTask extends Activity {17     18     private ImageView mImage;19     private ProgressDialog mDialog;20     21     @Override22     protected void onCreate (Bundle savedInstanceState) {23         super.onCreate(savedInstanceState);24         setContentView(R.layout.asyn_task);25         26         mDialog = new ProgressDialog(this);27         mDialog.setTitle("请稍等");28         mDialog.setMessage("正在加载...");29         30         mImage = (ImageView) findViewById(R.id.img);31         new ImageAsynTask().execute();32     }33     34     private class ImageAsynTask extends AsyncTask<Void, Void, Drawable> {35 36         @Override37         protected Drawable doInBackground (Void... params) {38             String url = "http://img1.3lian.com/img2011/07/20/05.jpg";39             return loadImages(url);40         }41         42         @Override43         protected void onPostExecute (Drawable result) {44             super.onPostExecute(result);45             mDialog.dismiss();46             mImage.setImageDrawable(result);47         }48         49         @Override50         protected void onPreExecute () {51             super.onPreExecute();52             mDialog.show();53         }54     }55     56     @Override57     protected void onDestroy () {58         super.onDestroy();59         mDialog.dismiss();60     }61     62     public Drawable loadImages(String url) { 63         try {64             return Drawable.createFromStream((InputStream)(new URL(url)).openStream(), "test");65         }66         catch (IOException e) {67             e.printStackTrace();68         }69         return null;70     }71 }

 运行一下,看下效果:

  1.显示progressDialog的时候,在加载图片但是图片还没有加载出来的时候:

  

另外需要注意的是,需要在manifest里面加入链接网络的权限:

  

1 <uses-permission android:name="android.permission.INTERNET"/>

  另外在onDestory()的时候要把progressDialog dismiss掉,不让在退出应用程序的时候会报错。

2、按返回键暂停异步任务

使用AsynTask异步任务处理耗时操作(work)时,通常会增加ProgressDialog进度条来显示等待操作(或加载进度)。

此时按返回键,因为焦点在ProgressDialog上,ProgressDialog捕获返回键操作,而Activity是不响应返回键操作的。

如果你想实现,当进行耗时操作时(ProgressDialog正在显示),按返回键,结束当前work操作。

你需要注意ProgressDialog的设置:

progress_dialog.setCancelable(true);//响应取消操作,这里如果设置false,按返回键ProgressDialog也不消失。
progress_dialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
      // TODO Auto-generated method stub

AsynTask.this.cancle(true);//执行异步线程取消操作
   }
});

同时注意,AsynTask执行cancele()操作后,相应的方法是如何执行。

You can stop a running task with cancel(true). A cancel will let the task finish its doInBackground but will never call onPostExecute. You could interrupt your background routine by checking isCanceled() and so return earlier since the task was killed.

参考:http://stackoverflow.com/questions/8209035/android-stop-asynctask-when-back-button-is-pressed-and-return-to-previous-acti

时间: 2024-10-11 02:01:58

安卓异步任务(2)的相关文章

android 安卓异步加载网络图片,与viewpager结合使用示例

[1]异步加载图片类AsyncImageLoader package com.example.testdddleapk.cus; import java.io.IOException; import java.lang.ref.SoftReference; import java.util.HashMap; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.

安卓 异步线程更新Ui

异步跟新UI: 1.handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构造方法里接收handler参数,然后执行完耗时操作后,通过handler发送消息来通知主UI线程更新UI 2.接口回调,定义一个接口,然后在主UI执行耗时操作的时候,借助匿名内部类,在这里写异步线程返回来的数据处理操作,异步线程接收一个匿名的内部类实例,然后在执行完耗时操作后回调接口的方法,可以把耗

安卓异步加载图片(缩略图显示)的实现

/** * 根据指定的图像路径和大小来获取缩略图 * 此方法有两点好处: * 1. 使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度, * 第二次读取的bitmap是根据比例压缩过的图像,第三次读取的bitmap是所要的缩略图. * 2. 缩略图对于原图像来讲没有拉伸,这里使用了2.2版本的新工具ThumbnailUtils,使 * 用这个工具生成的图像不会被拉伸. * @param imagePath 图像的路径 * @param width 指定输出图像的

安卓异步任务AsynTask(1)

1.AsynTask类结构asysTask类主要用到的几个内部回调函数有:doInBackGround() onPreExecute() onPostExecute() onProgressUpdate()复制代码正是这几个回调函数构成了AsynTask类的使用逻辑结构.注意:每个AsynTask子类必须至少复写doInBackGround()方法.2.回调逻辑关系调用关系如下图:    1>主线程调用AsynTask子类实例的execute()方法后,首先会调用onPreExecute()方法

安卓--异步处理工具类(AsyncTask)

.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" and

拨云见日---android异步消息机制源码分析

做过windows GUI的同学应该清楚,一般的GUI操作都是基于消息机制的,应用程序维护一个消息队列,开发人员编写对应事件的回调函数就能实现我们想要的操作 其实android系统也和windows GUI一样,也是基于消息机制,今天让我们通过源码来揭开android消息机制的神秘面纱 谈起异步消息,就不能不提及Handler,在安卓中,由于主线程中不能做耗时操作,所以耗时操作必须让子线程执行,而且只能在主线程(即UI线程)中执行UI更新操作,通过Handler发送异步消息,我们就能更新UI,一

Android Asynchronous Http Client 中文教程

本文为译文,原文链接https://loopj.com/android-async-http/ 安卓异步http客户端 概述 这是一个异步的基于回调的Android http客户端,构建于Apache httpclient库上.所有的请求都是独立于UI线程的,与此同时回调会由handler在发起请求的线程中执行.你也可以在后台线程和服务中使用它,这个库会自动识别它的运行环境. 特点 异步请求,回调处理. 不会阻塞UI线程. 使用线程池来负担并发请求. GET/POST参数构建. 文件分部上传(不

Android Ion 框架 文件下载

ion是的一个安卓异步网络和图片加载库. 特性 异步下载: 下载图片 (用ImageViews 或者 Bitmaps显示): 下载JSON文件 (通过Gson解析): 下载字符串: 下载文件: Fluent API: 当呼叫活动(calling Activity)结束时,可以自动取消网络操作. 所有的操作都返回一个Future(http://en.wikipedia.org/wiki/Futures_and_promises),并且可以取消: HTTP POST/PUT: 缓存: Gzip/De

高效加载本地相册图片的ImageLoader类

当我们相册中的图片有几千张的时候,你快速的拖动滚动条到底部,怎么样才能保证图片加载的流畅性以及避免OOM呢 1.使用Lru算法对图片进行缓存保证流畅性以及避免OOM 2.图片加载肯定是要异步进行的,那么就涉及到多线程的并发进行,使用线程池对任务进行调度 3.使用android内部的异步消息机制Looper+Handler对taskQueue进行轮询执行 1.图片加载器,task任务列频繁调用,所以要做成单例模式,编写一个单例的ImageLoader类,并声明必要的成员变量 /** * @auth