`
stchou
  • 浏览: 205453 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

浅谈Android ListView 异步图片获取

 
阅读更多

    浅谈Android ListView 异步图片获取

 

         Android应用中,从远程获取图片算是经常要用的一个功能,而图片资源往往会消耗比较大的流量,而且如果加载在图片比较多的View中,如ListView GridView WebView中,加载速度会比较缓慢。Android图片加载速度很慢的话,程序很容易就挂掉,等待的用户用户同样会等到崩溃。

 

我们一般的处理方法是:

 

 

异步下载

 

本地缓存

 

 

-----------------------------------------------------------

先说异步下载



 

 

如一个ListView的异步下载

 

public class AsyncActivity extends Activity  {
	List<data> insList;
	private ListView mListView;
	private ArrayList<data> mListItems;
	private ItemAdapter mAdapter;
	private ImageView mLfteView;
	private ImageView mRightView;
	
	

	private static final int REFRESH_LIST = 1;
	Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			int type = msg.what;
			switch (type) {
			case REFRESH_LIST: {
			
				if (mListItems.size() > 0) {
					mListView.setVisibility(View.VISIBLE);
					if (mAdapter== null) {
						mAdapter = new Adapter(AsyncActivity.this,
								mListItems);
						mListView.setAdapter(mAdapter);
					}
						mAdapter.notifyDataSetChanged();

				}
				mListView.requestFocus();
				
				unShowDialogLoading();
				break;
			}

		
			default:
				break;
			}
		};
	};

	
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.insurance_list); 
        initViews();
        getList();
    } 
  
    /**
     * 初始化view
     */
    private void initViews(){
    	
    	mListView = (ListView)findViewById(R.id.list);
    	mListView.setAdapter(mAdapter);
    	mListView.setOnItemClickListener(new OnItemClickListener(){
			public void onItemClick(AdapterView<?> arg0, View v, int id,
					long pos) {
		    	// 获得被单击的项     
		        //跳转
		    
			}
    	});
   
    	
    	mListItems = new ArrayList<data>();

    }

    
  
    private void getList() {
    	showDialogLoading();
    	 //得到列表
        Data ins = new Data();
        insList = ins.getList();
        mListItems.clear();
        mListItems.addAll(insList);
        mHandler.sendEmptyMessage(REFRESH_LIST);
        
        
    }
    

    private ProgressDialog mLoadingDialog;

	private void showDialogLoading() {
		mLoadingDialog = new ProgressDialog(this);                 
		mLoadingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		 //spinner  自旋体 像螺旋桨那样                             
		mLoadingDialog.setMessage("载入中,请稍候...");                 
		mLoadingDialog.setIndeterminate(false);//设置进度条是否为不明确                
		mLoadingDialog.setCancelable(true);//设置进度条是否可以按退回健取消                               
		mLoadingDialog.show(); 
	}

	private void unShowDialogLoading() {
		if (mLoadingDialog == null)
			return;
		else
			mLoadingDialog.dismiss();
	}
	
}

 

 

 

 它的Adapter是

 

public class ItemAdapter extends BaseAdapter{
	private ArrayList<data> mList;
	private Context mContext;
	// 异步加载图片的线程
	private AsyncImageLoader imageLoader = new AsyncImageLoader();
	//当前的缓存
    private Map<Integer, View> viewMap = new HashMap<Integer, View>();

	public InsuranceItemAdapter(Context context, ArrayList<data> ins) {
		mContext = context;
		mList= ins;
	}

	public InsuranceItemAdapter(Context context, ArrayList<data> ins,
			Handler handler) {
		mContext = context;
		mList= ins;
	}

	public void setInsurance(ArrayList<data> ins) {
		mList= ins;
	}
	
	
	
	public int getCount() {
		return mList.size();
	}

	public Object getItem(int position) {
		try {
			return mList.get(position);
		} catch (Exception ex) {
			return null;
		}
	}

	public long getItemId(int position) {
		return position;
	}

	
	private View newView() {
		InsItemView insView = new InsItemView(mContext);
		return insView;
	}
	
	
	
	public View getView(int position, View convertView, ViewGroup parent) {
		//先从缓存里面读取
		ViewHolder holder = null;  
		View view;  
		
		 if (viewMap.get(position) == null) {  
			view = newView();
			holder = new ViewHolder();  
			holder.mTitle = (TextView)view.findViewById(R.id.ins_title);
			holder.mTime = (TextView)view.findViewById(R.id.ins_time);
			holder.mType = (TextView)view.findViewById(R.id.ins_from);
			holder.mPic = (ImageView)view.findViewById(R.id.ins_small_pic);
			final int p = position;  
			viewMap.put(position, view);  
            view.setTag(holder);  
		 }else{
			 Log.e("MainActivity","position2 = "+position);  
             view = viewMap.get(position);  
             holder = (ViewHolder)view.getTag();  
		 }
		
		 data ins = mList.get(position);
		 holder.mTitle.setText(ins.getTitle());

		holder.mPic.setVisibility(View.VISIBLE);
		
		// 异步加载图片
		Drawable cachedImage = imageLoader.loadDrawable(ins.getPic(), holder.mPic,
				new ImageCallback() {
					public void imageLoaded(Drawable imageDrawable,
							ImageView imageView, String imageUrl) {
						imageView.setImageDrawable(imageDrawable);
					}
				});
		if (cachedImage != null) {
			holder.mPic.setImageDrawable(cachedImage);
		}
         
         return view;  

	}
	
	
	static class ViewHolder{  
		ImageView mPic;
		TextView mTitle;
		TextView mTime;
		TextView mType;
	}
}

 

 

 

 

 

 

  

原理简单,不罗嗦了

 

本地缓存

  

   就是先读取本地的数据,如果本地没有再从网络上获取

 

WebView中很简单,

//优先缓存 mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

 

 

  就能实现了。

 

 

其他地方我们就得自己写一个异步图片下载了,

 

 

package cn.ethink.activity.net;

import java.lang.ref.SoftReference;
import java.util.HashMap;

import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
import cn.ethink.activity.view.utils.ImageUtil;


public class AsyncImageLoader {

	 //SoftReference是软引用,是为了更好的为了系统回收变量
    private static HashMap<String, SoftReference<Drawable>> imageCache;
    
    static {
    	imageCache = new HashMap<String, SoftReference<Drawable>>();
    }
    
    
    public AsyncImageLoader() {
        
    }
    public Drawable loadDrawable(final String imageUrl,final ImageView imageView, final ImageCallback imageCallback){
        if (imageCache.containsKey(imageUrl)) {
            //从缓存中获取
            SoftReference<Drawable> softReference = imageCache.get(imageUrl);
            Drawable drawable = softReference.get();
            if (drawable != null) {
                return drawable;
            }
        }
        final Handler handler = new Handler() {
            public void handleMessage(Message message) {
                imageCallback.imageLoaded((Drawable) message.obj, imageView,imageUrl);
            }
        };
        //建立新一个新的线程下载图片
        new Thread() {
            @Override
            public void run() {
                Drawable drawable = null;
				try {
					drawable = ImageUtil.geRoundDrawableFromUrl(imageUrl, 20);
				} catch (Exception e) {
					e.printStackTrace();
				}
                imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
                Message message = handler.obtainMessage(0, drawable);
                handler.sendMessage(message);
            }
        }.start();
        return null;
    }
    //回调接口
    public interface ImageCallback {
        public void imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl);
    }
}

 

 

 

 

 

当然我们也可以存数据库中,从数据库中优先获取,当没有网络的时候达到离线阅读的功能。

 

 

 

<!--EndFragment-->

  • 大小: 8.6 KB
分享到:
评论

相关推荐

    Android ListView异步加载图片

    Android 异步加载图片,对ListView的异步加载图片的功能演示,主要根据url读取图片返回流的方法。为了方便演示,将请求图片的链接先固定,每读取好一个图片就更新,界面比较简单,当然你可以做成比较好的,像很多好...

    android listView 异步加载图片

    这篇名为“ImageLoader”的Java文件很可能就是一个实现图片异步加载的工具类。在Android中,我们通常使用AsyncTask、Handler、Thread、Service或者第三方库如Glide、Picasso、Universal Image Loader等来实现这个...

    Android Listview异步加载图片

    为了解决这个问题,我们需要实现ListView的图片异步加载。本文将深入探讨Android ListView中异步加载图片的策略、常见问题以及解决方案。 首先,我们要理解异步加载的基本原理。异步加载是指在后台线程中执行耗时...

    Android实现ListView异步加载图片

    "Android实现ListView异步加载图片" Android 实现 ListView 异步加载图片是一种常见的技术,旨在提高应用程序的性能和用户体验。本文将详细介绍 Android 中实现 ListView 异步加载图片的方法,并对相关的技术概念...

    android listview异步加载图片实例(线程池+数据库+本地保存)

    本实例将详细讲解如何实现“Android ListView异步加载图片”,结合线程池、数据库和本地保存来优化性能。 首先,我们需要理解异步加载的概念。在Android中,由于主线程负责用户界面的更新,因此不应在主线程中执行...

    android listView图片异步加载(拖动时不加载,双缓存)

    通过以上步骤,我们可以实现一个高效的图片异步加载方案,确保ListView在滚动时保持流畅,同时充分利用双缓存策略降低网络请求频率,提升应用性能。在实际项目中,可以根据需求选择合适的第三方库,或者自定义实现以...

    android ListView异步加载图片示例

    这个“android ListView异步加载图片示例”就是为了解决这个问题。 首先,我们要理解ListView的机制。ListView通过复用视图(convertView)来提高性能,即只有当前屏幕可见的几项会创建View,其余的View会在滚动时...

    Android ListView 异步加载图片

    在Android开发中,ListView是展示大量...通过以上策略,我们可以实现高效的Android ListView图片异步加载,提高应用的性能和用户体验。记得在编码过程中,注意代码的可读性和可维护性,遵循最佳实践,避免潜在的问题。

    android listview异步下载图片

    "android listview异步下载图片"这个话题就是关于如何高效地在ListView中异步加载网络图片。 在Android中,处理耗时操作如网络请求或文件读写,应尽量避免在主线程进行,以防阻塞UI更新。因此,我们会采用异步编程...

    Android ListView优化 异步加载图片

    在Android开发中,...通过以上介绍,你应该对Android ListView的优化有了更深入的理解,特别是异步加载图片和Json解析这两个关键环节。实践中,结合各种优化策略,能有效提升ListView的性能,提供流畅的用户体验。

    Android ListView从网络获取图片及文字显示

    这是【Android ListView从网络获取图片及文字显示】 http://blog.csdn.net/wangjinyu501/article/details/8219317 的源码。原文中有几处错误,导致程序不能正常运行。现在将这些BUG全部改全,将代码放上来,供大家...

    android listview 异步加载图片并防止错位

    通过以上技术,我们可以有效地解决ListView中图片异步加载的问题,提高用户体验。在提供的AsyncImageLoader-master项目中,可能包含了具体的实现方式,可以参考其源码学习如何自定义一个异步图片加载器。通过实践和...

    Android ListView中异步获取图片 源码

    因此,Android开发者需要掌握如何在ListView中异步获取并加载网络图片。本文将深入探讨这一主题,提供相关的源码分析。 首先,异步加载图片的目标是将耗时的操作(如网络请求和图片解码)移到后台线程,以避免阻塞...

    Android listview实现图片的异步加载Demo.zip

    总之,"Android listview实现图片的异步加载Demo.zip"是一个很好的学习资源,它可以帮助开发者理解和实践Android中图片异步加载的关键技术,提高应用的性能和用户体验。通过深入研究和模仿这个Demo,开发者可以掌握...

    AystnPicture_Android ListView异步加载图片.rar

    4. **Picasso、Glide、Fresco等库**: 这些是流行的Android图片加载库,它们已经内置了异步加载、缓存管理和错误处理等功能。比如,Picasso提供了简单易用的API,Glide则在内存管理上更为出色,而Fresco提供了更复杂...

    android listview 异步下载 优化1

    "android listview 异步下载 优化1"这个主题主要涉及到以下知识点: 1. **异步加载**:为了保证UI线程不被阻塞,网络请求和图片加载通常在后台线程执行。Android提供了AsyncTask、Handler、Thread、IntentService等...

    ListView异步加载图片

    这就是“ListView异步加载图片”这一知识点的核心。 异步加载图片的目的是将耗时的操作(如网络请求、图片解码)从主线程分离到后台线程执行,从而保持用户界面的流畅。在Android中,我们可以使用多种方式实现这一...

    android ListView异步加载图片和优化

    本篇将深入探讨如何在Android ListView中实现异步加载图片以及相关的优化策略。 1. **异步加载图片**:在ListView中,由于滚动频繁,直接同步加载网络图片会阻塞主线程,导致界面卡顿。为了解决这个问题,可以使用...

Global site tag (gtag.js) - Google Analytics