ListView数据异步加载图片和使用AsyncTask优化
2014-12-25 16:57
537 查看
从web端解析并加载其中的图片及文字到android端。
采用异步加载技术提高图片加载效率:
下面第一个是部署在web端的一个list.xml文件:
其中注意src的图片路径,更换下ip地址及工程名称即可。
目的就是就是解析该xml文件读取相应的图片及文字到android端。
android端:
布局:
主布局
部分功能代码:
MainActivity.java:
适配器ContactAdapter.java:
进一步优化,如果数据量太多,线程开的太多,会导致程序崩溃的,优化采用AsyncTask(Handler+Thread+线程池)实现。
修改ContactAdapter.java:
采用异步加载技术提高图片加载效率:
下面第一个是部署在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(){ @Override public void handleMessage(Message msg) { listView.setAdapter(new ContactAdpter(MainActivity.this,(List<Contact>)msg.obj, R.layout.listview_item,cache)); }; };//Handler的用法就是用于子线程与UI主线程通讯 @Override protected 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() { @Override public void run() { try { List<Contact> data = ContactService.getContacts(); handler.sendMessage(handler.obtainMessage(22, data)); } catch (Exception e) { e.printStackTrace(); } } }).start(); } @Override protected 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); } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } @Override public 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(){// @Override public void handleMessage(Message msg) { Uri uri = (Uri) msg.obj; if(uri!=null && imageView!=null){ imageView.setImageURI(uri); } } }; Runnable runnable = new Runnable() { @Override public 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 block e.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); } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } @Override public 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; } @Override protected Uri doInBackground(String... params) {//运行在子线程中 try { return ContactService.getImage(params[0], cache); } catch (Exception e) { e.printStackTrace(); }; return null; } //处理后的结果传给该方法进行处理 @Override protected 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(){// @Override public void handleMessage(Message msg) { Uri uri = (Uri) msg.obj; if(uri!=null && imageView!=null){ imageView.setImageURI(uri); } } }; Runnable runnable = new Runnable() { @Override public 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 block e.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; } } }
相关文章推荐
- Android ListView滑动过程中图片异步加载优化(配合Volley使用)
- (原创)使用AsyncTask(带修改线程池方式)+自定义ImageLoader+LRU算法对图片三级缓存及其显示优化(只有在ListView滑动停止的时候才去网络请求获取图片数据)
- Android异步加载学习笔记之三:用AsyncTask实现ListView中的图片数据加载
- Android ListView&异步加载的学习(三)——AsyncTask加载图片&运用Lru算法优化图片加载
- Android 解决ListView异步加载网络数据(图片文字)出现位置错乱以及优化ListView的加载
- ListView优化使用imageLoader下载和缓存图片,图片异步加载,解决图片多了之后容易卡顿。
- 优化 Android ListView 异步加载图片
- listview异步图片加载之优化篇(android)
- Android ListView异步加载图片优化
- Listview异步加载图片之优化篇(有图有码有解释)
- Android之ListView优化(使用Lrucache,图片滑动时使用默认图片,停止时加载)
- Android之ListView异步加载网络图片(优化缓存机制)
- listview异步图片加载之优化篇
- 使用NSoperation多线程异步加载图片数据
- Android listview异步加载图片(线程池,内存缓存,SD卡缓存)优化显示
- android学习笔记---64_ListView数据异步加载与AsyncTask
- Android中ListView使用- 网络图片的异步加载
- 使用NSoperation多线程异步加载图片数据
- Android:仿微博Listview与多线程功能(JSON、数据下载、图片加载、Listview、异步任务)
- Android进阶:ListView性能优化异步加载图片 使滑动效果流畅