android:异步任务asyncTask介绍及异步任务下载图片(带进度条)

为什么要用异步任务?

在android中只有在主线程才能对ui进行更新操作,而其它线程不能直接对ui进行操作

android本身是一个多线程的操作系统,我们不能把所有的操作都放在主线程中操作 ,比如一些耗时操作。如果放在主线程中 会造成阻塞 而当阻塞事件过长时 系统会抛出anr异常。所以我们要使用异步任务。android为我们提供了一个封装好的组件asynctask。

AsyncTask可以在子线程中更新ui,封装简化了异步操作。适用于简单的异步处理。如果多个后台任务时就要使用Handler了 在这里就不再说明。

AsyncTask通常用于被继承。AsyncTask定义了三种泛型类型<Params,Progress,Result>

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

Progress:后台任务执行的百分比

Result:执行任务完成后返回结果的类型

继承AsyncTask后要重写的方法有:

doInBackgroud:必须重写,异步执行后台线程要完成的任务,耗时任务要写在这里,并且在这里不能操作ui。可以调用 publishProgress方法来更新实时的任务进度

onPreExecute:执行耗时操作前调用,可以完成一些初始化操作

onPostExecute:在doInBackground 执行完成后,主线程调用此方法,可以在此方法中操作ui

onProgressUpdate:在doInBackgroud方法中调用publishProgress方法,更新任务的执行进度后 就会调用这个方法

下面通过一个实例来了解AsyncTask

首先附上运行结果

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btn_download"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="点击下载" />

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <ImageView
            android:id="@+id/iv_image"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:scaleType="fitCenter" />

    </FrameLayout>

</LinearLayout>

MainActivity

package com.example.asynctask;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URLConnection;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity implements OnClickListener{

	private ImageView image;
	private ProgressDialog progress;
	private Button btn_download;
	private static String URL="http://img4.imgtn.bdimg.com/it/u=1256159061,743487979&fm=21&gp=0.jpg";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		image=(ImageView) findViewById(R.id.iv_image);
		btn_download=(Button) findViewById(R.id.btn_download);
		progress=new ProgressDialog(this);
		progress.setIcon(R.drawable.ic_launcher);
		progress.setTitle("提示信息");
		progress.setMessage("正在下载,请稍候...");
		progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		btn_download.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		new MyAsyncTask().execute(URL);
	}
	/*
	 * String*********对应我们的URL类型
	 * Integer********进度条的进度值
	 * BitMap*********异步任务完成后返回的类型
	 * */
	class MyAsyncTask extends AsyncTask<String, Integer, Bitmap>{

		//执行异步任务(doInBackground)之前执行,并且在ui线程中执行
		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
			if(image!=null){
				image.setVisibility(View.GONE);
			}
			//开始下载 对话框进度条显示
			progress.show();
			progress.setProgress(0);
		}

		@Override
		protected Bitmap doInBackground(String... params) {
			// TODO Auto-generated method stub
			//params是一个可变长的数组 在这里我们只传进来了一个url
			String url=params[0];
			Bitmap bitmap=null;
			URLConnection connection;
			InputStream is;//用于获取数据的输入流
			ByteArrayOutputStream bos;//可以捕获内存缓冲区的数据,转换成字节数组。
			int len;
			float count=0,total;//count为图片已经下载的大小 total为总大小
			try {
				//获取网络连接对象
				connection=(URLConnection) new java.net.URL(url).openConnection();
				//获取当前页面的总长度
				total=(int)connection.getContentLength();
				//获取输入流
				is=connection.getInputStream();
				bos=new ByteArrayOutputStream();
				byte []data=new byte[1024];
				while((len=is.read(data))!=-1){
					count+=len;
					bos.write(data,0,len);
					//调用publishProgress公布进度,最后onProgressUpdate方法将被执行
					publishProgress((int)(count/total*100));
					//为了显示出进度 人为休眠0.5秒
					Thread.sleep(500);
				}
				bitmap=BitmapFactory.decodeByteArray(bos.toByteArray(), 0, bos.toByteArray().length);
				is.close();
				bos.close();
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return bitmap;
		}
		//在ui线程中执行 可以操作ui
		@Override
		protected void onPostExecute(Bitmap bitmap) {
			// TODO Auto-generated method stub
			super.onPostExecute(bitmap);
			//下载完成 对话框进度条隐藏
			progress.cancel();
			image.setImageBitmap(bitmap);
			image.setVisibility(View.VISIBLE);
		}

		/*
		 * 在doInBackground方法中已经调用publishProgress方法 更新任务的执行进度后
		 * 调用这个方法 实现进度条的更新
		 * */
		@Override
		protected void onProgressUpdate(Integer... values) {
			// TODO Auto-generated method stub
			super.onProgressUpdate(values);
			progress.setProgress(values[0]);
		}
	}
}

最后不要忘记在AndroidManifest文件中配置网络访问权限

	<uses-permission android:name="android.permission.INTERNET"/>
时间: 2024-10-17 23:38:23

android:异步任务asyncTask介绍及异步任务下载图片(带进度条)的相关文章

Android仿腾讯应用宝 应用市场,下载界面, 带进度按钮

最近做应用市场,需要用到,下载带进度的显示的按钮,因此找了下其他大神做的,直接拿来改进,并且删减掉大量没用到的.分享下改进后的. 重新修改,当下载进度有进度的时候,自动显示进度文字,并且设置其背景为灰色.其他情况背景都为绿色. demo下载地址: http://download.csdn.net/detail/xufeifandj/8289311 public class MainActivity extends Activity { private SubmitProcessButton im

PHP+ajaxForm异步带进度条上传文件实例

在使用ajaxForm方法之前,首先需要安装form.js的插件,网上有: 一.首先说用法,ajaxForm可以接收0或1个参数,该参数可以是一个变量.一个对象或回调函数,这个对象主要有以下参数: var object= {                     url:url, //form提交数据的地址   type:type,   //form提交的方式(method:post/get)   target:target, //服务器返回的响应数据显示的元素(Id)号           

HTML5 jQuery+FormData 异步上传文件,带进度条

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link href="../resources/css/common.css" rel="stylesheet" /> <script src="../resources/js/jquery-2.1.4.js"></script> <

Android更新带进度条的通知栏

在网上查询了下,Android版本号更新通知栏带进度条,醉了,基本都是复制过来.有的代码不全,连源代码下载都没有,有下载也须要积分.还不能用.真黑心啊!! 之前自己也写过自己定义通知栏Notification,想了还是自己写吧. 由于在通知栏更新,须要訪问网络下载,就写了个服务.在服务中实现了下载个更新. 先看MainActivity代码: package com.wsj.wsjdemo; import android.os.Bundle; import android.app.Activity

Android -- 自定义带进度条的按钮

1. 实现了一个带进度条的按钮,完成后显示提示信息,并设置按钮为不可再次被点击 2. 所需要的图片               3.  代码 MainActivity package com.example.buttondemo; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View;

Android UI组件进阶(1)——带进度条的按钮

Android UI组件进阶(1)--带进度条的按钮 本节引言: 这个系列是继Android UI组件实例大全后的进阶系列,在该系列中我们将进一步的学习 Android UI组件,建议阅读本系列前线学习下UI组件实例大全系列,掌握基本组件的使用; 当然你也可以直接学习本系列!好了,废话不多说,直接开始第一节吧!本节要演示的是: 带进度条的按钮!相信大家在360手机助手到看到这个东东吧: 本节要实现的就是下方这个点击后显示进度的按钮 效果图: 必备基础: 1.进度条的一些属性: backgroun

ajax 异步上传视频带进度条并提取缩略图

最近在做一个集富媒体功能于一身的项目.需要上传视频.这里我希望做成异步上传,并且有进度条,响应有状态码,视频连接,缩略图. 1 { 2 "thumbnail": "/slsxpt//upload/thumbnail/6f05d4985598160c548e6e8f537247c8.jpg", 3 "success": true, 4 "link": "/slsxpt//upload/video/6f05d498559

PHP+Ajax异步带进度条上传文件

前端引入文件 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"> <script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script> <script src="

android mvp高速开发框架介绍(dileber使用之图片下载工具)

这几天忙着工作- 今天抽时间又把框架的bug处理了一下--并且把volley的源代码改动了一下 android mvp框架:dileber(https://github.com/dileber/dileber.git) 官方交流qq群:171443726 我个人qq:297165331--有什么问题也能够咨询-- 继续解说dileber的图片下在工具 我改动了volley的NetworkImageView 的源代码--使得框架中的网络请求和图片请求都走一个接口 dileber中怎样使用下载图片的