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. bootstrap中的Grid system详解

    啦啦啦,都十月中旬啦,好快啊,这个月的多一半都过去了,然而我才写第三篇随笔,小颖得加油啦~~~ 下面来看下小颖给大家分享的内容 1.   .col-md-*和.col-xs-* <!doctyp ...

  2. Why Namespace? - 每天5分钟玩转 OpenStack(102)

    上一节我们讨论了 Neutron 将虚拟 router 放置到 namespace 中实现了不同 subnet 之间的路由.今天探讨为什么要用 namespace 封装 router? 回顾一下前面的 ...

  3. Rehosting the Workflow Designer

    官方文档:https://msdn.microsoft.com/en-us/library/dd489451(v=vs.110).aspx The Windows Workflow Designer ...

  4. iOS开发之山寨版新浪微博小结

    在之前的博客IOS开发之新浪围脖中获取微博的内容是使用我自己的access_token来请求的数据,那么如何让其他用户也能登陆并获取自己的微博内容呢?接下来就是OAuth和SSO出场的时候啦.OAut ...

  5. php创建新用户注册界面布局实例

    php创建新用户注册界面布局实例 <!DOCTYPE> <html> <head> <title>Load page</title> < ...

  6. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...

  7. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  8. 使用 gpg 加密文件 - 通过 shell 或 php

    使用 gpg 加密文件 - 通过 shell 或 php 背景:客户提供私钥,并要求我方通过php把加密后的文件传输给他们. 环境 macOS Sierra 10.12.1 php 7.0.8 0.安 ...

  9. ASP.NET通过递归添加树(Treeview)

    先来看看效果,基本上就是这样的. 所谓树,无非就是2点,第一个:根节点,第二:叶子节点,其中叶子节点中还可能有叶子节点,但是根节点始终只有一个. 下面贴上 各部分的代码 1.PAGE_LOAD载入事件 ...

  10. 自动实现接口的实例,mybatis就是这样实现的

    思考 很多人用过MyBatis,或者使用过SpringData,那么和传统的jdbc相比,差别在哪里呢?传统的dao层,接口需要有实现,需要连接发出sql,需要接收返回值,但是mybatis只需要实现 ...