Android中的AsyncTask异步加载图片
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异步加载图片相关推荐
- Android 开发笔记 ListView异步加载图片
当ListView需要在线获取数据,并且列表中需要显示图片时,友好的处理方式是使用异步加载图片的方式. 这是因为LIstView中显示的内容是分为两部加载的,第一次加载文本信息(包含图片的uri地址) ...
- android grideview 图片png透明,Android完美解决GridView异步加载图片和加载大量图片时出现Out Of Memory问题...
众所周知,我们在使用GridView或者ListView时,通常会遇到两个棘手的问题: 1.每个Item获取的数据所用的时间太长会导致程序长时间黑屏,更甚会导致程序ANR,也就是Application ...
- Android开发之ListView异步加载图片
ListView这个控件对于大家肯定不会陌生,即使你是初学者相信也会用ListView.因为ListView这个控件实在是太常用,可以说基本上每一个项目开发都会用到它,今天这篇博客主要讲解,ListV ...
- android多种方式实现异步加载图片
记得之前做安卓应用时都是在2.2以下的版本,如果在UI线程中进行耗时操作,比如http,socket等 会产生android.os.NetworkOnMainThreadException 如果异步加 ...
- Android之使用Android-AQuery异步加载图片(一)
第一节:转载地址(http://www.cnblogs.com/lee0oo0/archive/2012/10/25/2738299.html) // 必须实现AQuery这个类 AQuery aq ...
- android百度地图覆盖物异步加载图片,Android 百度地图marker中图片不显示的解决方法(推荐)...
目的: 根据提供的多个经纬度,显示所在地的marker样式,如下: 问题: 1.发现marker中在线加载的图片无法显示出来: 2.获取多个对象后,却只显示出了一个marker: 以下为官网实现方法: ...
- Android 图文混排 异步加载图片
学习老罗课程的练习实例 1.原始json数据来自图灵机器人,URL为:http://www.tuling123.com/openapi/api?key=36082454b270b90d0900d251 ...
- android listview 上拉图片闪烁,android listview使用glide异步加载图片错位,闪烁问题...
参考网上方法:https://www.jianshu.com/p/f5593b87ee07 // 获取图像控件的Tag String tag = (String) holder.imgView.get ...
- android listview使用glide异步加载图片错位,闪烁问题
参考网上方法:https://www.jianshu.com/p/f5593b87ee07 // 获取图像控件的Tag String tag = (String) holder.imgView.get ...
最新文章
- chrome使用技巧(看了定不让你失望)
- SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并
- oracle 哦【的【,清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦
- Mybatis 针对ORACLE和MYSQL的批量插入与多参数批量删除
- 【PHPStorm使用手册】如何设置字体大小?
- Flutter TextField设置默认值默认值和光标位置
- 用JS判断浏览器是否是IE9以下,处理可能遇到的兼容性问题,或者给出浏览器版本过低的升级提醒。
- 双网卡上网冲突解决_产品介绍 | H3C 终端准入控制解决方案
- java ireport 打印_ireport客户端打印
- Android 7.1 亮度调节之BrightnessController
- 好好讲一讲:到底什么是Java架构师(含福利放送)
- 盛金公式解一元三次方程_一元三次方程解法(卡尔丹公式法盛金公式法)
- scala 惰性函数
- 微信页面模板基础知识汇总
- 如何通过虚拟机和真实网线调试设备
- clickhouse 生产集群部署之坑坑洼洼(三)
- Problem M 单数变复数
- android传递socket对象,Android Socket通信详解
- 平板的android版本是5.0.2,安卓5.0平板诺基亚N1迎来第二个更新
- python 降维 聚类_python数据挖掘实战之四:聚类
热门文章
- framebuffer 保存 bmp图片格式
- DRAM、SRAM、SDRAM、DDRSDRAM的区别
- 计算机区块链的杂志,计算机类 | SPE诚邀区块链专刊(CCF B类,IF:1.338)
- 决策树(Decision Tree)和随机森林
- 比特币钱包(5) BIP44 账户表示形式
- 设计模式--状态(State)模式
- python——多态
- [How TO]-ubuntu20.10上安装Pulse Secure客户端
- optee的共享内存的介绍
- 密码学-hash散列表