• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > android:异步任务asyncTask介绍及异步任务下载图片(带进度条)

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

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android asynctask,android中asynctask,android.os.asynctask,asynctask异步任务,asynctask等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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


为什么要用异步任务?

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

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

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

AsyncTask通常用于被继承。AsyncTask定义了三种泛型类型

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">

    </imageview></framelayout></button></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{
		
		//执行异步任务(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"></uses-permission>

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • AsyncTask注意事项,面试技巧和注意事项
  • 再谈Android AsyncTask的优缺点,androidasynctask
  • Android中AsyncTask分析--你所不注意的坑,androidasynctask
  • AsyncTask基础(笔记)
  • Android中AsyncTask基本用法与源码剖析(API 23)
  • android源码解析之(二)--)异步任务AsyncTask
  • AsyncTask源码探究,asynctask源码
  • android:异步任务asyncTask介绍及异步任务下载图片(带进度条)
  • Android线程操作对象AsyncTask线程机制
  • AsyncTask.cancel()的结束问题,asynctaskcancel

相关文章

  • 2017-05-26机顶盒上gridview+ScrollView的使用。,gridviewscrollview
  • 2017-05-26Android之Pull解析XML,androidpullxml
  • 2017-05-26安卓开发之RecyclerView,安卓recyclerview
  • 2017-05-26Kotlin与Android SDK 集成(KAD 05),kotlinandroid
  • 2017-05-26Android_安卓为按钮控件绑定事件的五种方式,android按钮控件
  • 2017-05-26arcgis andriod 加载影像,arcgisandriod
  • 2017-05-26Android对话框,android弹出对话框
  • 2017-05-26Android N(API level 24.)废弃了Html.fromHtml(String),ios添加api废弃警告
  • 2017-05-26Android 实用代码片段,
  • 2017-05-26andriod 带看括弧的计算器,andriod括弧计算器

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android数据存储方式--SharedPreferences,sharedpreferences
    • ImageView的ScaleType属性,imageviewscaletype
    • Android特效专辑(九)——仿微信雷达搜索好友特效,逻辑清晰实现简单
    • Android 高仿华为手机Tab页滑动导航效果
    • 编译器开发系列--Ocelot语言7.中间代码,编译器--ocelot
    • 填坑实录 Android Studio 利用 ADB WIFI 插件实现真机无线调试,androidadb
    • 致DBA:为什么你经常犯错,是因为你做的功课不够
    • ListView和Adapter的配合使用以及Adapter的重写,listviewadapter
    • 《Android Studio实用指南》12.18 文本搜索工具
    • 新版mysql搭建多线程主从复制

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有