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
原创粉丝点击