AsyncTask是用来处理一些后台的比较耗时的任务,给用户带来良好的体验。AsyncTask扩展Thread,增强了与主线程的交互能力。

首先介绍AsyncTask中定义的以下几个方法:

onPreExecute():该方法在执行后台操作前被UI线程调用,可以做一些准备工作,如图片加载之前先显示进度条等

doInBackground(Params...):该方法运行在后台线程中,比较耗时的操作可以写在此方法中

onProgressUpdate(Progress...):该方法只有在doInBackground(Params...)方法中调用了publishProgress()方法时候才会执行,用来显示后台任务的进展情况

onPostExecute(Result): doInBackground(Params...)方法执行完毕以后,此方法会被UI线程调用,可以在此方法中对UI进行操作,比如显示图片内容等

其次是AsyncTask中的三个参数:

Params 启动任务执行的输入参数,比如HTTP请求的URL。

Progress 后台任务执行的进度值。

Result 后台执行任务最终返回的结果。

最后用一个异步加载网络图片的实例更好的体现AsyncTask的作用:

首先访问网络记得加入网络访问的权限

1.Android项目的MainActivity的xml文件中放置button按钮如图:

2.新建一个Activity用来显示网络加载的图片,在此Activity中新建一个内部类继承AsyncTask详情请参考代码以及注释:

xml文件中:

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".ImageActivity" > <ImageView
android:id="@+id/imageView" android:layout_width="match_parent"
android:layout_height="match_parent"/> <ProgressBar
android:id="@+id/progressBar1"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" /> </RelativeLayout>

Activity中:

package com.example.netdemo;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection; import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.ProgressBar; public class ImageActivity extends Activity {
private ProgressBar progressBar;
private ImageView imageView;
//图片的地址
private static final String URL="http://img3.3lian.com/2013/s1/20/d/57.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_image);
findViewById();
//启动
new MyAsyncTask().execute(URL);
} private void findViewById() {
// TODO Auto-generated method stub
progressBar = (ProgressBar) findViewById(R.id.progressBar1);
imageView = (ImageView) findViewById(R.id.imageView);
}
/**
* @String 传入的参数为图片的URL地址,String类型,
* @Void 进度值先不考虑所以返回为空,
* @Bitmap 后台执行任务最终返回的结果为一张图片Bitmap类型
* @author cyf
*
*/
class MyAsyncTask extends AsyncTask<String, Void, Bitmap>{
//后台没有运行完毕之前做的准备工作,在这我们让原本隐藏的progressBar显示
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
//后台运行的时候进度条显示
progressBar.setVisibility(View.VISIBLE);
}
//在后台进行网络访问,得到图片并返回
@Override
protected Bitmap doInBackground(String... arg0) {
// TODO Auto-generated method stub
String url=arg0[0];
Bitmap bitmap=null;
//定义网络连接对象
URLConnection connection;
InputStream is;
try {
connection= new URL(url).openConnection();
is=connection.getInputStream();
BufferedInputStream bis=new BufferedInputStream(is);
//将输入流解析成Bipmap
bitmap=BitmapFactory.decodeStream(bis);
is.close();
bis.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}
//在次方法中接收后台返回的Bitmap值并且设置到UI
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
//显示的progressBar再设置为隐藏
progressBar.setVisibility(View.GONE);
//在此方法中设置UI线程显示图片
imageView.setImageBitmap(result); }
}
}

上结果图:

点击button之后的准备界面(progressBar显示表示正在加载):

加载完成之后:

欢迎大家提供意见,希望能给大家带来帮助,谢谢。

Android—初识AsyncTask的更多相关文章

  1. Android笔记——AsyncTask介绍

    AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操 ...

  2. 详解Android中AsyncTask的使用

    在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更 ...

  3. 55.Android之AsyncTask介绍 (转)

    AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操 ...

  4. android高级---->AsyncTask的源码分析

    在Android中实现异步任务机制有两种方式,Handler和AsyncTask,它在子线程更新UI的例子可以参见我的博客(android基础---->子线程更新UI).今天我们通过一个小的案例 ...

  5. Android 多线程----AsyncTask异步任务详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  6. Android使用AsyncTask实现可以断点续传的DownloadManager功能

    http://www.it165.net/pro/html/201211/4210.html 最近做项目卡壳了,要做个Android的应用市场,其他方面都还好说,唯独这个下载管理算是给我难住了,究其原 ...

  7. Android测试AsyncTask下载图片

    package com.example.myact8_async; import org.apache.http.HttpEntity; import org.apache.http.HttpResp ...

  8. Android开发——AsyncTask详解

    android提供AsynvTask,目的是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的. Android为了降低开发难度,提供了AsyncTask.Asyn ...

  9. 具体解释Android中AsyncTask的使用

    在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式须要为每个任务创建一个新的线程,任务完毕后通过Handler实例向UI线程发送消息,完毕界面的更新 ...

随机推荐

  1. 使用pudb调试python

    本博客主要用于讲解如何使用pudb进行python调试: 1.安装 sudo pip install pudb pip list查看安装结果: 2.使用 测试程序: #!/usr/bin/env py ...

  2. Android应用中实现系统“分享”接口

    在android下各种文件管理器中,我们选择一个文件,点击分享可以看到弹出一些app供我们选择,这个是android系统分享功能,我们做的app也可以出现在这个列表中. 第一步:在Manifest.x ...

  3. ES6 - Note7:Generator函数

    Generator函数 1.Generator函数是ES6增加的异步编程解决方案之一,与普通的函数行为完全不同,类似于一个状态机,内部封装了多个状态. 在函数定义的形式上,跟普通函数差不多,有两处不同 ...

  4. golang开发环境配置及Beego框架安装

    配置环境:Windows7推荐IDE:LiteIDEGO下载地址:http://www.golangtc.com/downloadBeego开发文档地址:http://beego.me/docs/in ...

  5. iOS 如何在整个屏幕中都能实现滑动返回的效果

    - (void)setupGetsInNav { UIGestureRecognizer *gesture = self.interactivePopGestureRecognizer; gestur ...

  6. 1Z0-053 争议题目解析512

    1Z0-053 争议题目解析512 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 512.Which two statements correctly describe the r ...

  7. JQuery中使用Ajax实现诸如登录名检测等异步请求Demo

    上一篇博客介绍了注册登录时一次性图形验证码的工具类的编写,这篇随笔同样是我在写用jquery中ajax实现登录信息检测的异步请求功能的笔记,在各个网站进行信息用户注册时,需要在不刷新页面的情况下对注册 ...

  8. C# 利用socekt做到http监听,怎么样才能做到高性能

    c#原始提供了http的监听的类HttpListener,实现了简单的http.文章地址<C# 控制台或者winform程序开启http的监听状态> 但是经过我测试,这个HttpListe ...

  9. 《C#并发编程经典实例》笔记

    1.前言 2.开宗明义 3.开发原则和要点 (1)并发编程概述 (2)异步编程基础 (3)并行开发的基础 (4)测试技巧 (5)集合 (6)函数式OOP (7)同步 1.前言 最近趁着项目的一段平稳期 ...

  10. C#基础知识四之override和new的区别

    override override是派生类用来重写基类方法的.调用的派生类方法,如需调用基类方法用base关键字 override不能重写非虚方法或静态方法. override重写必须用abstrac ...