[android] 练习使用ListView(二)
2023-02-18 15:47:42 时间
主要练习异步任务和LruCache缓存
package com.android.test; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.util.LruCache; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends Activity { private ListView lv_images; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv_images = (ListView) findViewById(R.id.lv_images); ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this); ImageLoader.getInstance().init(configuration); ListAdapter adapter = new ImageAdapter(); lv_images.setAdapter(adapter); } /** * 适配器 * @author taoshihan * */ class ImageAdapter extends BaseAdapter { private LruCache<String, BitmapDrawable> mImageCache; public ImageAdapter() { int maxSize=(int) (Runtime.getRuntime().maxMemory()/8); mImageCache=new LruCache<String, BitmapDrawable>(maxSize){ protected int sizeOf(String key, BitmapDrawable drawable) { return drawable.getBitmap().getByteCount(); }; }; } @Override public View getView(int position, View convertView, ViewGroup parent) { String url=(String) getItem(position); View view; if(convertView!=null){ view=convertView; }else{ view=View.inflate(getApplicationContext(), R.layout.image_item, null); } ImageView imageView=(ImageView) view.findViewById(R.id.tv_image); BitmapDrawable bitmapDrawable=getBitmapFromMemoryCache(url); if(bitmapDrawable!=null){ //读取缓存图片 imageView.setImageDrawable(bitmapDrawable); }else{ //读取网络图片 ImageWorkerTask task=new ImageWorkerTask(imageView); task.execute(url); } return view; } /** * 从缓存中读取图片 * @param key * @return */ public BitmapDrawable getBitmapFromMemoryCache(String key) { if(mImageCache.get(key)!=null){ return mImageCache.get(key); } return null; } public void addBitmapToMemoryCache(String key,BitmapDrawable drawable){ if(getBitmapFromMemoryCache(key)==null){ mImageCache.put(key, drawable); } } @Override public int getCount() { // TODO Auto-generated method stub return Images.IMAGE_URLS.length; } @Override public Object getItem(int position) { return Images.IMAGE_URLS[position]; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } /** * 异步任务 * @author taoshihan * */ class ImageWorkerTask extends AsyncTask<String, Void, BitmapDrawable>{ private ImageView imageView; public ImageWorkerTask(ImageView imageView) { this.imageView=imageView; } @Override protected BitmapDrawable doInBackground(String... params) { String imageUrl=params[0]; Bitmap bitmap=downLoadBitmap(imageUrl); BitmapDrawable drawable=new BitmapDrawable(getApplicationContext().getResources(),bitmap); addBitmapToMemoryCache(imageUrl, drawable); return drawable; } //下载图片 private Bitmap downLoadBitmap(String imageUrl) { Bitmap bitmap=null; try { URL url=new URL(imageUrl); HttpURLConnection conn=(HttpURLConnection) url.openConnection(); conn.setConnectTimeout(10000); InputStream is=conn.getInputStream(); bitmap=BitmapFactory.decodeStream(is); } catch (Exception e) { } return bitmap; } //下载完成的 @Override protected void onPostExecute(BitmapDrawable result) { if(imageView!=null&&result!=null){ imageView.setImageDrawable(result); } } } } static class Images{ public final static String[] IMAGE_URLS = new String[]{ "//img-my.csdn.net/uploads/201508/05/1438760758_3497.jpg", "//img-my.csdn.net/uploads/201508/05/1438760758_6667.jpg", "//img-my.csdn.net/uploads/201508/05/1438760757_3588.jpg", "//img-my.csdn.net/uploads/201508/05/1438760756_3304.jpg", "//img-my.csdn.net/uploads/201508/05/1438760755_6715.jpeg", "//img-my.csdn.net/uploads/201508/05/1438760726_5120.jpg", "//img-my.csdn.net/uploads/201508/05/1438760726_8364.jpg", "//img-my.csdn.net/uploads/201508/05/1438760725_4031.jpg", "//img-my.csdn.net/uploads/201508/05/1438760724_9463.jpg", "//img-my.csdn.net/uploads/201508/05/1438760724_2371.jpg", "//img-my.csdn.net/uploads/201508/05/1438760707_4653.jpg" }; } }
相关文章
- vue中全局引入bootstrap.css
- 微搭低代码xChatGPT,五步搭建AI聊天机器人小程序
- 微信开放平台之第三方平台开发,模板小程序如何提交?
- 尝试Capacitor(Vue+Android)混合开发
- 小程序|炎炎夏日、清爽一夏、头像大换装
- Mac下安装NDK(android开发)
- textview设置字体大小-Android应用开发之TextView设置个别字体样式
- java小程序微信支付与提现
- iphone没有sim卡能用吗-升级ios15无sim卡怎么办
- MacDroid for mac(安卓设备文件传输助手) v1.6.1中文版
- 使用JQuery和bootstrap-select实现世界城市的三级联动(中英互译)
- AnyMP4 iOS Cleaner for mac(IOS文件清理工具)v1.0.16激活版
- 药物互助小程序的120个小时
- Android平台GB28181设备接入端如何实时更新经纬度实现国标平台侧电子地图位置标注
- Android 子线程 UI 操作真的不可以?
- 移动安全-安卓frida hook基础篇
- 微信开放Donut,我们的App也能像微信跑小程序了
- Android Activity Deeplink启动来源获取源码分析
- Android构建工具--AAPT2源码解析(一)
- Android模块化开发实践