AsyncTask简介:

AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦。

阅读 AsyncTask的源码可知,AsyncTask是使用java.util.concurrent 框架来管理线程以及任务的执行的,concurrent框架是一个非常 成熟,高效的框架,经过了严格的测试。这说明AsyncTask的设计很好的解决了匿名线程存在的问题。

AsyncTask是抽象类,AsyncTask定义了三种泛型类型 Params,Progress和Result

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

2,Progress 后台任务执行的百分比

3,Result 后台执行任务最终返回的结果,比如String。

子类必须实现抽象方法doInBackground(Params… p) ,在此方法中实现任务的执行工作,比如连接网络获取数据等。通常还应该实现onPostExecute(Result r)方法,因为应用程序关心的结果在此方法中返回。需要注意的是AsyncTask一定要在主线程中创 建实例。

AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的 就是实现这些方法。在任务的执行过程中,这些方法被自动调用,运行过程:

1,onPreExecute() 当任务执行之前开始调用此方法,可以在这里显示进度对话框。2,doInBackground(Params…) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用 publicProgress(Progress…)来更新任务的进度。

3,onProgressUpdate(Progress…) 此方法在主线程执行,用于显示任务执行的进度。

4,onPostExecute(Result) 此方法在主线程执行,任务执行的结果作为此方法的参数返回

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"><ListViewandroid:id="@+id/listview"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>

list_item.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" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="150dp"android:layout_alignParentLeft="true"android:layout_alignParentRight="true"android:layout_alignParentTop="true" ><ImageViewandroid:id="@+id/imageView"android:layout_width="match_parent"android:layout_height="match_parent"android:src="@android:drawable/alert_dark_frame" /></LinearLayout>
</RelativeLayout>

ImageAdapter.java

package com.hust.asynctaskdemo;import java.util.ArrayList;import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;public class ImageAdapter extends BaseAdapter {private ArrayList<Drawable> imagesArrayList;private Context mContext;private LayoutInflater mInflater;public ImageAdapter(ArrayList<Drawable> imagesArrayList, Context mContext) {super();this.imagesArrayList = imagesArrayList;this.mContext = mContext;mInflater=LayoutInflater.from(this.mContext);}@Overridepublic int getCount() { return imagesArrayList.size();}@Overridepublic Object getItem(int position) {return imagesArrayList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder mHolder=null;if(convertView==null){convertView=mInflater.inflate(R.layout.list_item, null);mHolder=new ViewHolder();mHolder.mImageView=(ImageView) convertView.findViewById(R.id.imageView);convertView.setTag(mHolder);}else{mHolder=(ViewHolder) convertView.getTag();}mHolder.mImageView.setImageDrawable(imagesArrayList.get(position));return convertView;}public class ViewHolder{public ImageView mImageView;}
}

MainActivity.java

package com.hust.asynctaskdemo;import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;import android.support.v7.app.ActionBarActivity;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;public class MainActivity extends ActionBarActivity {private  ListView mListView;private  ArrayList<String> urlList;private  ArrayList<Drawable> imagesData;@SuppressWarnings("unchecked")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);urlList=new ArrayList<String>();urlList.add("http://img3.douban.com/view/event_poster/large/public/2a35a85a873e8e7.jpg");urlList.add("http://img3.douban.com/view/event_poster/large/public/ce66e0569742fd7.jpg");urlList.add("http://img3.douban.com/view/event_poster/large/public/4c44752e83900d9.jpg");mListView=(ListView) findViewById(R.id.listview);AsyncTask<ArrayList<String>, Integer, ArrayList<Drawable>> task=new AsyncTask<ArrayList<String>, Integer, ArrayList<Drawable>>(){@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();}@Overrideprotected ArrayList<Drawable> doInBackground(ArrayList<String>... params) {//params是可变数组参数List<String> imageUriList = params[0];ArrayList<Drawable> imageList=new ArrayList<Drawable>();for(String url:imageUriList){try {URL mUrl=new URL(url);Drawable mDrawable=Drawable.createFromStream(mUrl.openStream(), "src");imageList.add(mDrawable);} catch (IOException e) {                    e.printStackTrace();}}return imageList;}@Overrideprotected void onPostExecute(ArrayList<Drawable> result) {//imagesData=result;ImageAdapter mImageAdapter=new ImageAdapter(result, MainActivity.this);mListView.setAdapter(mImageAdapter);}                };task.execute(urlList);}}

网络权限:

   <uses-permission android:name="android.permission.INTERNET"/>

参考:

http://blog.csdn.net/tianxiangshan/article/details/7871667

http://blog.csdn.net/shineflowers/article/details/41746443

Android中的AsyncTask异步加载图片相关推荐

  1. Android 开发笔记 ListView异步加载图片

    当ListView需要在线获取数据,并且列表中需要显示图片时,友好的处理方式是使用异步加载图片的方式. 这是因为LIstView中显示的内容是分为两部加载的,第一次加载文本信息(包含图片的uri地址) ...

  2. android grideview 图片png透明,Android完美解决GridView异步加载图片和加载大量图片时出现Out Of Memory问题...

    众所周知,我们在使用GridView或者ListView时,通常会遇到两个棘手的问题: 1.每个Item获取的数据所用的时间太长会导致程序长时间黑屏,更甚会导致程序ANR,也就是Application ...

  3. Android开发之ListView异步加载图片

    ListView这个控件对于大家肯定不会陌生,即使你是初学者相信也会用ListView.因为ListView这个控件实在是太常用,可以说基本上每一个项目开发都会用到它,今天这篇博客主要讲解,ListV ...

  4. android多种方式实现异步加载图片

    记得之前做安卓应用时都是在2.2以下的版本,如果在UI线程中进行耗时操作,比如http,socket等 会产生android.os.NetworkOnMainThreadException 如果异步加 ...

  5. Android之使用Android-AQuery异步加载图片(一)

    第一节:转载地址(http://www.cnblogs.com/lee0oo0/archive/2012/10/25/2738299.html) // 必须实现AQuery这个类 AQuery aq ...

  6. android百度地图覆盖物异步加载图片,Android 百度地图marker中图片不显示的解决方法(推荐)...

    目的: 根据提供的多个经纬度,显示所在地的marker样式,如下: 问题: 1.发现marker中在线加载的图片无法显示出来: 2.获取多个对象后,却只显示出了一个marker: 以下为官网实现方法: ...

  7. Android 图文混排 异步加载图片

    学习老罗课程的练习实例 1.原始json数据来自图灵机器人,URL为:http://www.tuling123.com/openapi/api?key=36082454b270b90d0900d251 ...

  8. android listview 上拉图片闪烁,android listview使用glide异步加载图片错位,闪烁问题...

    参考网上方法:https://www.jianshu.com/p/f5593b87ee07 // 获取图像控件的Tag String tag = (String) holder.imgView.get ...

  9. android listview使用glide异步加载图片错位,闪烁问题

    参考网上方法:https://www.jianshu.com/p/f5593b87ee07 // 获取图像控件的Tag String tag = (String) holder.imgView.get ...

最新文章

  1. chrome使用技巧(看了定不让你失望)
  2. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并
  3. oracle 哦【的【,清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦
  4. Mybatis 针对ORACLE和MYSQL的批量插入与多参数批量删除
  5. 【PHPStorm使用手册】如何设置字体大小?
  6. Flutter TextField设置默认值默认值和光标位置
  7. 用JS判断浏览器是否是IE9以下,处理可能遇到的兼容性问题,或者给出浏览器版本过低的升级提醒。
  8. 双网卡上网冲突解决_产品介绍 | H3C 终端准入控制解决方案
  9. java ireport 打印_ireport客户端打印
  10. Android 7.1 亮度调节之BrightnessController
  11. 好好讲一讲:到底什么是Java架构师(含福利放送)
  12. 盛金公式解一元三次方程_一元三次方程解法(卡尔丹公式法盛金公式法)
  13. scala 惰性函数
  14. 微信页面模板基础知识汇总
  15. 如何通过虚拟机和真实网线调试设备
  16. clickhouse 生产集群部署之坑坑洼洼(三)
  17. Problem M 单数变复数
  18. android传递socket对象,Android Socket通信详解
  19. 平板的android版本是5.0.2,安卓5.0平板诺基亚N1迎来第二个更新
  20. python 降维 聚类_python数据挖掘实战之四:聚类

热门文章

  1. framebuffer 保存 bmp图片格式
  2. DRAM、SRAM、SDRAM、DDRSDRAM的区别
  3. 计算机区块链的杂志,计算机类 | SPE诚邀区块链专刊(CCF B类,IF:1.338)
  4. 决策树(Decision Tree)和随机森林
  5. 比特币钱包(5) BIP44 账户表示形式
  6. 设计模式--状态(State)模式
  7. python——多态
  8. [How TO]-ubuntu20.10上安装Pulse Secure客户端
  9. optee的共享内存的介绍
  10. 密码学-hash散列表