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. 处理UnicodeDecodeError: ‘XXX' codec can't decode bytes in position...的问题

    错误信息: UnicodeDecodeError: ‘XXX' codec can't decode bytes in position 2-5: illegal multibyte sequence ...

  2. JavaScript == 、!=、===、!===的比较

    ; '; ; test == num //true 相同类型 相同值 test === num //true 相同类型 相同值 test !== num //false test与num类型相同,其值 ...

  3. 深入学习jQuery的三种常见动画效果

    × 目录 [1]显隐效果 [2]高度变化 [3]淡入淡出 前面的话 动画效果是jQuery吸引人的地方.通过jQuery的动画方法,能够轻松地为网页添加视觉效果,给用户一种全新的体验.jQuery动画 ...

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

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

  5. Don't let self-built concept imprison yourself

    If Self-inferiority is disease, but self-confidence is hazard. Leo moon personalities can be extreme ...

  6. 自己实现简单的string类

    1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...

  7. 让你的Mac支持NTFS

    前段时间换成Mac电脑之后,发现有一点不爽,不能在Mac下写入NTFS格式的磁盘,所以就去研究了一下. 解决方法有如下三种. 第一种,直接使用第三方软件,如Paragon NTFS for MAC,T ...

  8. spring @import和@importResource

    @ImportResource in spring imports application xml in configuration file which is using @Configuratio ...

  9. 关于在用curl函数post网页数据时,遇上表单提交 type为submit 类型而且没有name和id时可能遇到的问题及其解决方法

    curl函数库实现爬网页内容的链接在 http://www.cnblogs.com/linguanh/p/4292316.html 下面这个是没有name和id 标识的 <input type= ...

  10. hibernate笔记--缓存机制之 二级缓存(sessionFactory)和查询缓存

    二级缓存(sessionFactory): Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存.它可以缓存整个应用的持久化对象,所以又称为“SessionFactor ...