为什么要用异步任务?

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

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

  1. Android开发(24)---安卓中实现多线程下载(带进度条和百分比)

    当我们学完java中多线程的下载后,可以将它移植到我们的安卓中来,下面是具体实现源码: DownActivity.java package com.example.downloads; import ...

  2. android AsyncTask异步下载并更新进度条

    AsyncTask异步下载并更新进度条    //如果不是很明白请看上篇文章的异步下载 AsyncTask<String, Integer, String> 第一个参数:String 传入 ...

  3. Android带进度条的文件上传,使用AsyncTask异步任务

    最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可. A ...

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

    在使用ajaxForm方法之前,首先需要安装form.js的插件,网上有: 一.首先说用法,ajaxForm可以接收0或1个参数,该参数可以是一个变量.一个对象或回调函数,这个对象主要有以下参数: v ...

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

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link href ...

  6. Android零基础入门第52节:自定义酷炫进度条

    原文:Android零基础入门第52节:自定义酷炫进度条 Android系统默认的ProgressBar往往都不能满足实际开发需要,一般都会开发者自定义ProgressBar. 在Android开发中 ...

  7. 025 Android 带进度条的对话框(ProgressDialog)

    1.ProgressDialog介绍 ProgressDialog可以在当前界面弹出一个置顶于所有界面元素的对话框,同样具有屏蔽其他控件的交互能力,用于提示用户当前操作正在运行,让用户等待: 2.应用 ...

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

    1. 实现了一个带进度条的按钮,完成后显示提示信息,并设置按钮为不可再次被点击

  9. Android特效专辑(十一)——仿水波纹流量球进度条控制器,实现高端大气的主流特效

    Android特效专辑(十一)--仿水波纹流球进度条控制器,实现高端大气的主流特效 今天看到一个效果挺不错的,就模仿了下来,加上了一些自己想要的效果,感觉还不错的样子,所以就分享出来了,话不多说,上图 ...

随机推荐

  1. 用 C 语言编写一个简单的垃圾回收器

    人们似乎觉得编写垃圾回收机制是非常难的,是一种仅仅有少数智者和Hans Boehm(et al)才干理解的高深魔法.我觉得编写垃圾回收最难的地方就是内存分配,这和阅读K&R所写的malloc例 ...

  2. c语言实现皇帝翻牌游戏

    一个综合的游戏,对所学的知识进行整合!融会贯通! #include <stdio.h> #include <stdlib.h> #include <string.h> ...

  3. UESTC--1262--Memory(dfs)

    Memory Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu SubmitStatus De ...

  4. 【IOI 2011】Race

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2599 [算法] 点分治 [代码] #include<bits/stdc++.h ...

  5. 利用CSS3中的clac()实现按照屏幕分辨率自适应宽度

    1.简介 calc()看其外表像个函数.平时在制作页面的时候,总会碰到有的元素是100%的宽度(例如body元素).如果元素宽度为100%时,其自身不带其他盒模型属性设置还好,要是有别的,那将导致盒子 ...

  6. oracle 优化之组合索引

    组合索引适用场景: 1.适用在单独查询返回记录很多,组合查询后忽然返回记录很少的情况: 比如where 学历=硕士以上 返回不少的记录 比如where 职业=收银员 同样返回不少的记录 于是无论哪个条 ...

  7. 在Maven中引入spring的DAO、DOMAIN、CONTROLLER、VIEW

    除了mysql外麻雀虽小,五脏俱全. 参照之前的博客建立好的maven项目如图. 第一步 : 向maven项目中的pom文件添加依赖 ,然后maven install

  8. Redis学习笔记(十) 命令进阶:事务操作

    原文链接:http://doc.redisfans.com/transaction/index.html Redis中也提供了对于事务的支持,由于Redis是单线程处理Client的请求,所以实现起来 ...

  9. C# 特性(Attribute)

    C# 特性(Attribute) 特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签.您可以通过使用特性向程序添加声明性信息.一个声明 ...

  10. FluentAPI关系映射配置

    都有哪几种关系? 1vs多,多vs多 1. 概念or关系映射相关方法: 1) 基本套路:this.Has***(o=>o.AAA).With***() 当前这个表和AAA属性的表关系是Has定义 ...