zoukankan      html  css  js  c++  java
  • 浅谈Android ListView 异步图片获取

        浅谈Android ListView 异步图片获取

     

     

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

     

    我们一般的处理方法是:

     

     

    异步下载

     

    本地缓存

     

     

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

    先说异步下载



     

     

    如一个ListView的异步下载

     

    Java代码  收藏代码
    1. public class AsyncActivity extends Activity  {  
    2.     List<data> insList;  
    3.     private ListView mListView;  
    4.     private ArrayList<data> mListItems;  
    5.     private ItemAdapter mAdapter;  
    6.     private ImageView mLfteView;  
    7.     private ImageView mRightView;  
    8.       
    9.       
    10.   
    11.     private static final int REFRESH_LIST = 1;  
    12.     Handler mHandler = new Handler() {  
    13.         public void handleMessage(android.os.Message msg) {  
    14.             int type = msg.what;  
    15.             switch (type) {  
    16.             case REFRESH_LIST: {  
    17.               
    18.                 if (mListItems.size() > 0) {  
    19.                     mListView.setVisibility(View.VISIBLE);  
    20.                     if (mAdapter== null) {  
    21.                         mAdapter = new Adapter(AsyncActivity.this,  
    22.                                 mListItems);  
    23.                         mListView.setAdapter(mAdapter);  
    24.                     }  
    25.                         mAdapter.notifyDataSetChanged();  
    26.   
    27.                 }  
    28.                 mListView.requestFocus();  
    29.                   
    30.                 unShowDialogLoading();  
    31.                 break;  
    32.             }  
    33.   
    34.           
    35.             default:  
    36.                 break;  
    37.             }  
    38.         };  
    39.     };  
    40.   
    41.       
    42.     public void onCreate(Bundle savedInstanceState) {   
    43.         super.onCreate(savedInstanceState);   
    44.         setContentView(R.layout.insurance_list);   
    45.         initViews();  
    46.         getList();  
    47.     }   
    48.     
    49.     /** 
    50.      * 初始化view 
    51.      */  
    52.     private void initViews(){  
    53.           
    54.         mListView = (ListView)findViewById(R.id.list);  
    55.         mListView.setAdapter(mAdapter);  
    56.         mListView.setOnItemClickListener(new OnItemClickListener(){  
    57.             public void onItemClick(AdapterView<?> arg0, View v, int id,  
    58.                     long pos) {  
    59.                 // 获得被单击的项       
    60.                 //跳转  
    61.               
    62.             }  
    63.         });  
    64.      
    65.           
    66.         mListItems = new ArrayList<data>();  
    67.   
    68.     }  
    69.   
    70.       
    71.     
    72.     private void getList() {  
    73.         showDialogLoading();  
    74.          //得到列表  
    75.         Data ins = new Data();  
    76.         insList = ins.getList();  
    77.         mListItems.clear();  
    78.         mListItems.addAll(insList);  
    79.         mHandler.sendEmptyMessage(REFRESH_LIST);  
    80.           
    81.           
    82.     }  
    83.       
    84.   
    85.     private ProgressDialog mLoadingDialog;  
    86.   
    87.     private void showDialogLoading() {  
    88.         mLoadingDialog = new ProgressDialog(this);                   
    89.         mLoadingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);  
    90.          //spinner  自旋体 像螺旋桨那样                               
    91.         mLoadingDialog.setMessage("载入中,请稍候...");                   
    92.         mLoadingDialog.setIndeterminate(false);//设置进度条是否为不明确                  
    93.         mLoadingDialog.setCancelable(true);//设置进度条是否可以按退回健取消                                 
    94.         mLoadingDialog.show();   
    95.     }  
    96.   
    97.     private void unShowDialogLoading() {  
    98.         if (mLoadingDialog == null)  
    99.             return;  
    100.         else  
    101.             mLoadingDialog.dismiss();  
    102.     }  
    103.       
    104. }  

     

     

     它的Adapter是

     

    Java代码  收藏代码
    1. public class ItemAdapter extends BaseAdapter{  
    2.     private ArrayList<data> mList;  
    3.     private Context mContext;  
    4.     // 异步加载图片的线程  
    5.     private AsyncImageLoader imageLoader = new AsyncImageLoader();  
    6.     //当前的缓存  
    7.     private Map<Integer, View> viewMap = new HashMap<Integer, View>();  
    8.   
    9.     public InsuranceItemAdapter(Context context, ArrayList<data> ins) {  
    10.         mContext = context;  
    11.         mList= ins;  
    12.     }  
    13.   
    14.     public InsuranceItemAdapter(Context context, ArrayList<data> ins,  
    15.             Handler handler) {  
    16.         mContext = context;  
    17.         mList= ins;  
    18.     }  
    19.   
    20.     public void setInsurance(ArrayList<data> ins) {  
    21.         mList= ins;  
    22.     }  
    23.       
    24.       
    25.       
    26.     public int getCount() {  
    27.         return mList.size();  
    28.     }  
    29.   
    30.     public Object getItem(int position) {  
    31.         try {  
    32.             return mList.get(position);  
    33.         } catch (Exception ex) {  
    34.             return null;  
    35.         }  
    36.     }  
    37.   
    38.     public long getItemId(int position) {  
    39.         return position;  
    40.     }  
    41.   
    42.       
    43.     private View newView() {  
    44.         InsItemView insView = new InsItemView(mContext);  
    45.         return insView;  
    46.     }  
    47.       
    48.       
    49.       
    50.     public View getView(int position, View convertView, ViewGroup parent) {  
    51.         //先从缓存里面读取  
    52.         ViewHolder holder = null;    
    53.         View view;    
    54.           
    55.          if (viewMap.get(position) == null) {    
    56.             view = newView();  
    57.             holder = new ViewHolder();    
    58.             holder.mTitle = (TextView)view.findViewById(R.id.ins_title);  
    59.             holder.mTime = (TextView)view.findViewById(R.id.ins_time);  
    60.             holder.mType = (TextView)view.findViewById(R.id.ins_from);  
    61.             holder.mPic = (ImageView)view.findViewById(R.id.ins_small_pic);  
    62.             final int p = position;    
    63.             viewMap.put(position, view);    
    64.             view.setTag(holder);    
    65.          }else{  
    66.              Log.e("MainActivity","position2 = "+position);    
    67.              view = viewMap.get(position);    
    68.              holder = (ViewHolder)view.getTag();    
    69.          }  
    70.           
    71.          data ins = mList.get(position);  
    72.          holder.mTitle.setText(ins.getTitle());  
    73.   
    74.         holder.mPic.setVisibility(View.VISIBLE);  
    75.           
    76.         // 异步加载图片  
    77.         Drawable cachedImage = imageLoader.loadDrawable(ins.getPic(), holder.mPic,  
    78.                 new ImageCallback() {  
    79.                     public void imageLoaded(Drawable imageDrawable,  
    80.                             ImageView imageView, String imageUrl) {  
    81.                         imageView.setImageDrawable(imageDrawable);  
    82.                     }  
    83.                 });  
    84.         if (cachedImage != null) {  
    85.             holder.mPic.setImageDrawable(cachedImage);  
    86.         }  
    87.            
    88.          return view;    
    89.   
    90.     }  
    91.       
    92.       
    93.     static class ViewHolder{    
    94.         ImageView mPic;  
    95.         TextView mTitle;  
    96.         TextView mTime;  
    97.         TextView mType;  
    98.     }  
    99. }  

     

     

     

     

     

     

      

    原理简单,不罗嗦了

     

    本地缓存

      

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

     

    Java代码  收藏代码
    1. WebView中很简单,  
    2.   
    3. //优先缓存 mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  

     

     

      就能实现了。

     

     

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

     

     

    Java代码  收藏代码
      1. package cn.ethink.activity.net;  
      2.   
      3. import java.lang.ref.SoftReference;  
      4. import java.util.HashMap;  
      5.   
      6. import android.graphics.drawable.Drawable;  
      7. import android.os.Handler;  
      8. import android.os.Message;  
      9. import android.widget.ImageView;  
      10. import cn.ethink.activity.view.utils.ImageUtil;  
      11.   
      12.   
      13. public class AsyncImageLoader {  
      14.   
      15.      //SoftReference是软引用,是为了更好的为了系统回收变量  
      16.     private static HashMap<String, SoftReference<Drawable>> imageCache;  
      17.       
      18.     static {  
      19.         imageCache = new HashMap<String, SoftReference<Drawable>>();  
      20.     }  
      21.       
      22.       
      23.     public AsyncImageLoader() {  
      24.           
      25.     }  
      26.     public Drawable loadDrawable(final String imageUrl,final ImageView imageView, final ImageCallback imageCallback){  
      27.         if (imageCache.containsKey(imageUrl)) {  
      28.             //从缓存中获取  
      29.             SoftReference<Drawable> softReference = imageCache.get(imageUrl);  
      30.             Drawable drawable = softReference.get();  
      31.             if (drawable != null) {  
      32.                 return drawable;  
      33.             }  
      34.         }  
      35.         final Handler handler = new Handler() {  
      36.             public void handleMessage(Message message) {  
      37.                 imageCallback.imageLoaded((Drawable) message.obj, imageView,imageUrl);  
      38.             }  
      39.         };  
      40.         //建立新一个新的线程下载图片  
      41.         new Thread() {  
      42.             @Override  
      43.             public void run() {  
      44.                 Drawable drawable = null;  
      45.                 try {  
      46.                     drawable = ImageUtil.geRoundDrawableFromUrl(imageUrl, 20);  
      47.                 } catch (Exception e) {  
      48.                     e.printStackTrace();  
      49.                 }  
      50.                 imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));  
      51.                 Message message = handler.obtainMessage(0, drawable);  
      52.                 handler.sendMessage(message);  
  • 相关阅读:
    JavaWeb-过滤器入门
    JavaWeb-监听器
    JavaWeb-session的钝化和活化
    Create-React-App项目外使用它的eslint配置
    三种方法在当前目录下打开cmd命令窗口
    js脚本实现自动上传至github
    js中的柯里化
    从小白到使用antd+react+react-router+issue+es6搭建博客
    react在router中传递数据的2种方法
    教你怎么看网站是用react搭建的
  • 原文地址:https://www.cnblogs.com/firecode/p/2977378.html
Copyright © 2011-2022 走看看