ListView数据异步加载图片和使用AsyncTask优化
来源:互联网 发布:砍柴网源码下载 编辑:程序博客网 时间:2024/05/18 00:10
从web端解析并加载其中的图片及文字到android端。
采用异步加载技术提高图片加载效率:
下面第一个是部署在web端的一个list.xml文件:
<?xml version="1.0" encoding="utf-8"?><contacts><contact id="1"><name>张飞</name><image src="http://192.168.1.106:8080/SecondaryMarket/images/new-pic1.jpg"></image></contact><contact id="2"><name>关羽</name><image src="http://192.168.1.106:8080/SecondaryMarket/images/i1.jpg"></image></contact><contact id="3"><name>小宁</name><image src="http://192.168.1.106:8080/SecondaryMarket/images/i2.jpg"></image></contact><contact id="4"><name>拉刘</name><image src="http://192.168.1.106:8080/SecondaryMarket/images/i3.jpg"></image></contact><contact id="5"><name>张三</name><image src="http://192.168.1.106:8080/SecondaryMarket/images/i4.jpg"></image></contact><contact id="6"><name>李四</name><image src="http://192.168.1.106:8080/SecondaryMarket/images/i5.jpg"></image></contact><contact id="7"><name>张飞</name><image src="http://192.168.1.106:8080/SecondaryMarket/images/i6.jpg"></image></contact><contact id="8"><name>小宋</name><image src="http://192.168.1.106:8080/SecondaryMarket/images/i1.jpg"></image></contact><contact id="9"><name>妹子</name><image src="http://192.168.1.106:8080/SecondaryMarket/images/i2.jpg"></image></contact></contacts>
其中注意src的图片路径,更换下ip地址及工程名称即可。
目的就是就是解析该xml文件读取相应的图片及文字到android端。
android端:
布局:
主布局
<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="com.example.dataasync.MainActivity" > <ListView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/listView" /></RelativeLayout>每一个listview中选项的布局:listview_item.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="match_parent" android:orientation="horizontal" > <ImageView android:layout_width="120dp" android:layout_height="120dp" android:id="@+id/imageView" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:textColor="#000000" android:id="@+id/textView" /></LinearLayout>
部分功能代码:
MainActivity.java:
package com.example.dataasync;import java.io.File;import java.util.ArrayList;import java.util.List;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.support.v7.app.ActionBarActivity;import android.util.Log;import android.widget.ListView;import android.widget.Toast;import cn.example.domain.Contact;import com.example.adpter.ContactAdpter;import com.example.service.ContactService;public class MainActivity extends ActionBarActivity {private ListView listView;File cache;Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {listView.setAdapter(new ContactAdpter(MainActivity.this,(List<Contact>)msg.obj,R.layout.listview_item,cache));};};//Handler的用法就是用于子线程与UI主线程通讯@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = (ListView) this.findViewById(R.id.listView);cache = new File(Environment.getExternalStorageDirectory(),"cache");if(!cache.exists()){cache.mkdirs();}//采用异步方式得到联系人数据new Thread(new Runnable() {@Overridepublic void run() {try {List<Contact> data = ContactService.getContacts();handler.sendMessage(handler.obtainMessage(22, data));} catch (Exception e) {e.printStackTrace();}}}).start();}@Overrideprotected void onDestroy() {for(File file:cache.listFiles()){file.delete();}cache.delete();super.onDestroy();}}
适配器ContactAdapter.java:
package com.example.adpter;import java.io.File;import java.util.List;import com.example.dataasync.R;import com.example.service.ContactService;import cn.example.domain.Contact;import android.content.Context;import android.net.Uri;import android.os.Handler;import android.os.Message;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;public class ContactAdpter extends BaseAdapter{private List<Contact> data; private int listviewItem;private File cache;LayoutInflater layoutInflater;public ContactAdpter(Context context,List<Contact> data, int listviewItem, File cache) {this.data = data;this.listviewItem = listviewItem;this.cache = cache;layoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);}@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return data.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ImageView imageView;TextView textView;if(convertView == null){convertView = layoutInflater.inflate(listviewItem, null); imageView = (ImageView) convertView.findViewById(R.id.imageView);textView = (TextView) convertView.findViewById(R.id.textView);convertView.setTag(new DataWraper(imageView, textView));}else{DataWraper dataWraper = (DataWraper) convertView.getTag();imageView = dataWraper.imageView;textView = dataWraper.textView;}Contact contact = data.get(position);System.out.println(contact.name+":"+contact.image);textView.setText(contact.name);//这是设置textview控件//设置imageview控件asycImageLoad(imageView,contact.image);return convertView;}private void asycImageLoad(final ImageView imageView, final String path) {//执行在主线程中,往主线程中的队列中添加消息final Handler handler = new Handler(){//@Overridepublic void handleMessage(Message msg) {Uri uri = (Uri) msg.obj;if(uri!=null && imageView!=null){imageView.setImageURI(uri);}}};Runnable runnable = new Runnable() {@Overridepublic void run() {try {System.out.println("tdw");Uri uri = ContactService.getImage(path, cache);System.out.println("uri"+uri);//在子线程中通过handler往主线程添加消息handler.sendMessage(handler.obtainMessage(10,uri));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}};new Thread(runnable).start();}public final class DataWraper{public ImageView imageView;public TextView textView;public DataWraper(ImageView imageView, TextView textView) {this.imageView = imageView;this.textView = textView;}}}
进一步优化,如果数据量太多,线程开的太多,会导致程序崩溃的,优化采用AsyncTask(Handler+Thread+线程池)实现。
修改ContactAdapter.java:
package com.example.adpter;import java.io.File;import java.util.List;import com.example.dataasync.R;import com.example.service.ContactService;import cn.example.domain.Contact;import android.content.Context;import android.net.Uri;import android.os.AsyncTask;import android.os.Handler;import android.os.Message;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;public class ContactAdpter extends BaseAdapter{private List<Contact> data; private int listviewItem;private File cache;LayoutInflater layoutInflater;public ContactAdpter(Context context,List<Contact> data, int listviewItem, File cache) {this.data = data;this.listviewItem = listviewItem;this.cache = cache;layoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);}@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return data.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ImageView imageView;TextView textView;if(convertView == null){convertView = layoutInflater.inflate(listviewItem, null); imageView = (ImageView) convertView.findViewById(R.id.imageView);textView = (TextView) convertView.findViewById(R.id.textView);convertView.setTag(new DataWraper(imageView, textView));}else{DataWraper dataWraper = (DataWraper) convertView.getTag();imageView = dataWraper.imageView;textView = dataWraper.textView;}Contact contact = data.get(position);System.out.println(contact.name+":"+contact.image);textView.setText(contact.name);//这是设置textview控件//设置imageview控件asycImageLoad(imageView,contact.image);return convertView;}//采用AsyncTask(Handler+Thread+线程池)private void asycImageLoad(ImageView imageView, String path) {AsyncImageTask asyncImageTask = new AsyncImageTask(imageView);asyncImageTask.execute(path);}public final class AsyncImageTask extends AsyncTask<String, Integer, Uri>{private ImageView imageView;public AsyncImageTask(ImageView imageView) {this.imageView = imageView;}@Overrideprotected Uri doInBackground(String... params) {//运行在子线程中try {return ContactService.getImage(params[0], cache);} catch (Exception e) {e.printStackTrace();};return null;}//处理后的结果传给该方法进行处理@Overrideprotected void onPostExecute(Uri result) {//运行在主线程中个,该机制内部自带线程数和handler对象if(result!=null && imageView!=null){imageView.setImageURI(result);}}}/*private void asycImageLoad(final ImageView imageView, final String path) {//执行在主线程中,往主线程中的队列中添加消息final Handler handler = new Handler(){//@Overridepublic void handleMessage(Message msg) {Uri uri = (Uri) msg.obj;if(uri!=null && imageView!=null){imageView.setImageURI(uri);}}};Runnable runnable = new Runnable() {@Overridepublic void run() {try {System.out.println("tdw");Uri uri = ContactService.getImage(path, cache);System.out.println("uri"+uri);//在子线程中通过handler往主线程添加消息handler.sendMessage(handler.obtainMessage(10,uri));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}};new Thread(runnable).start();}*/public final class DataWraper{public ImageView imageView;public TextView textView;public DataWraper(ImageView imageView, TextView textView) {this.imageView = imageView;this.textView = textView;}}}
0 0
- ListView数据异步加载图片和使用AsyncTask优化
- 利用AsyncTask高效异步加载图片,适用于ListView 和GridView
- 使用AsyncTask异步加载图片
- listview异步图片加载优化
- Android:ListView数据异步加载、Handler、AsyncTask
- Android异步加载学习笔记之三:用AsyncTask实现ListView中的图片数据加载
- ListView AsynTask异步加载网络Json格式数据和图片显示的优化
- Android ListView&异步加载的学习(三)——AsyncTask加载图片&运用Lru算法优化图片加载
- ListView异步加载图片方法和滚动优化
- ListView异步加载图片方法和滚动优化
- AsyncTask用法和异步加载图片
- 异步加载图片AsyncTask
- AsyncTask异步加载图片
- AsyncTask异步加载图片
- AsyncTask案例——异步加载ListView内容,包括优化
- Listview异步加载图片之优化篇
- Android ListView异步加载图片优化
- listview异步图片加载之优化篇
- Spring学习2—Spring容器
- linux : VNC使用命令 以及 复制VNC里面的内容到windows本地
- Tomcat 系统架构与设计模式 第 1 部分: 工作原理
- 如何在MacBook Pro Retina上安装Linux
- Linux 安装mysql
- ListView数据异步加载图片和使用AsyncTask优化
- Android 常用权限
- 应用架构设计“防火”经验分享
- 使用hibernate tools插件生成POJO
- wordpress文章内容调用
- CSS背景颜色渐变
- videoview 框架笔记
- 1412251650-蓝桥杯-基础练习 杨辉三角形
- 32位 Ubuntu 14.04 安装 DiskSim