【安卓知识点汇总】 UI加载大卫星图处理
2016-12-20 17:08
253 查看
本Blog 接上一篇:【安卓知识点汇总】Bitmap位图解码
依然使用到自己封装好的两个工具类:
HttpUtils
BitmapTools
这里就不赘述了,工具类详情见上篇。
这里定义bean类图片数据封装:便于调用
主代码逻辑实现:
另:layout文件:
子布局:item.xml:
上述表述也很详细,这里就不罗列了。
依然使用到自己封装好的两个工具类:
HttpUtils
BitmapTools
这里就不赘述了,工具类详情见上篇。
这里定义bean类图片数据封装:便于调用
public class Images { /** * 提供可以访问的字符串的url */ public final static String[] imageUrls = new String[] { "https://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg", "https://lh4.googleusercontent.com/--dq8niRp7W4/URquVgmXvgI/AAAAAAAAAbs/-gnuLQfNnBA/s1024/A%252520Song%252520of%252520Ice%252520and%252520Fire.jpg", "https://lh5.googleusercontent.com/-7qZeDtRKFKc/URquWZT1gOI/AAAAAAAAAbs/hqWgteyNXsg/s1024/Another%252520Rockaway%252520Sunset.jpg", "https://lh3.googleusercontent.com/--L0Km39l5J8/URquXHGcdNI/AAAAAAAAAbs/3ZrSJNrSomQ/s1024/Antelope%252520Butte.jpg", "https://lh6.googleusercontent.com/-8HO-4vIFnlw/URquZnsFgtI/AAAAAAAAAbs/WT8jViTF7vw/s1024/Antelope%252520Hallway.jpg", "https://lh4.googleusercontent.com/-WIuWgVcU3Qw/URqubRVcj4I/AAAAAAAAAbs/YvbwgGjwdIQ/s1024/Antelope%252520Walls.jpg", "https://lh4.googleusercontent.com/-xBPxWpD4yxU/URquxWHk8AI/AAAAAAAAAbs/ARDPeDYPiMY/s1024/Lava%252520from%252520the%252520Sky.jpg", "https://lh3.googleusercontent.com/-897VXrJB6RE/URquxxxd-5I/AAAAAAAAAbs/j-Cz4T4YvIw/s1024/Leica%25252050mm%252520Summilux.jpg", "https://lh5.googleusercontent.com/-qSJ4D4iXzGo/URquyDWiJ1I/AAAAAAAAAbs/k2pBXeWehOA/s1024/Leica%25252050mm%252520Summilux.jpg", "https://lh6.googleusercontent.com/-dwlPg83vzLg/URquylTVuFI/AAAAAAAAAbs/G6SyQ8b4YsI/s1024/Leica%252520M8%252520%252528Front%252529.jpg", "https://lh3.googleusercontent.com/-R3_EYAyJvfk/URquzQBv8eI/AAAAAAAAAbs/b9xhpUM3pEI/s1024/Light%252520to%252520Sand.jpg", "https://lh3.googleusercontent.com/-fHY5h67QPi0/URqu0Cp4J1I/AAAAAAAAAbs/0lG6m94Z6vM/s1024/Little%252520Bit%252520of%252520Paradise.jpg", "https://lh5.googleusercontent.com/-TzF_LwrCnRM/URqu0RddPOI/AAAAAAAAAbs/gaj2dLiuX0s/s1024/Lone%252520Pine%252520Sunset.jpg", "https://lh5.googleusercontent.com/-kI_QdYx7VlU/URqvLXCB6gI/AAAAAAAAAbs/N31vlZ6u89o/s1024/Yet%252520Another%252520Rockaway%252520Sunset.jpg", "https://lh4.googleusercontent.com/-e9NHZ5k5MSs/URqvMIBZjtI/AAAAAAAAAbs/1fV810rDNfQ/s1024/Yosemite%252520Tree.jpg" }; ... ... }
主代码逻辑实现:
public class MainActivity extends Activity { private ListView listView; // 图片的链接 private String[] imageUrls = Images.imageUrls; private ImageAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) this.findViewById(R.id.listView1); adapter = new ImageAdapter(); listView.setAdapter(adapter); adapter.notifyDataSetChanged(); } public class ImageAdapter extends BaseAdapter { @Override public int getCount() { // TODO Auto-generated method stub return imageUrls.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return imageUrls[position]; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View view = null; if (convertView == null) { view = LayoutInflater.from(MainActivity.this).inflate( R.layout.item, null); } else { view = convertView; } ImageView imageView = (ImageView) view .findViewById(R.id.imageView1); // 从网络中获取数据,填充到imageview中 // 可能会造成图片的错位: loadBitmap(imageUrls[position], imageView); return view; } } /** * 在滑动这些ListView的时候,会对就的布局进行资源回收,如果ListView结合异步任务操作的时候,不能确保重用的布局被及时回收 * * @author jack * */ static class AsyncDrawable extends BitmapDrawable { private final SoftReference<BitmapWorkerTask> softReference; public AsyncDrawable(Resources resources, Bitmap bitmap, BitmapWorkerTask bitmapWorkerTask) { super(resources, bitmap); softReference = new SoftReference<MainActivity.BitmapWorkerTask>( bitmapWorkerTask); } public BitmapWorkerTask getBitmapWorkerTask() { return softReference.get(); } } /** * 异步任务 * * @author jack * */ class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> { private SoftReference<ImageView> imageSoftReference; private String data = ""; public BitmapWorkerTask(ImageView imageView) { imageSoftReference = new SoftReference<ImageView>(imageView); } @Override protected Bitmap doInBackground(String... params) { // TODO Auto-generated method stub data = params[0]; byte[] result = HttpUtils.sendPost(data); // 解码过程 return BitmapTools.decodeBitmap(result, 100, 100); } @Override protected void onPostExecute(Bitmap bitmap) { // TODO Auto-generated method stub super.onPostExecute(bitmap); if (isCancelled()) { bitmap = null; } if (imageSoftReference != null && bitmap != null) { final ImageView imageView = imageSoftReference.get(); final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView); if (this == bitmapWorkerTask && imageView != null) { imageView.setImageBitmap(bitmap); } } } } private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) { if (imageView != null) { final Drawable drawable = imageView.getDrawable(); if (drawable instanceof AsyncDrawable) { final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable; return asyncDrawable.getBitmapWorkerTask(); } } return null; } /** * * @param data * @param imageView * @return */ public static boolean cancelPotntialWork(String data, ImageView imageView) { final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView); if (bitmapWorkerTask != null) { final String bitmapData = bitmapWorkerTask.data; if (bitmapData != data) { bitmapWorkerTask.cancel(true); } else { return false; } } return true; } /** * 加载图片 * * @param data * @param imageView */ public void loadBitmap(String data, ImageView imageView) { Bitmap placeBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.empty_photo); if (cancelPotntialWork(data, imageView)) { final BitmapWorkerTask task = new BitmapWorkerTask(imageView); final AsyncDrawable asyncDrawable = new AsyncDrawable( getResources(), placeBitmap, task); imageView.setImageDrawable(asyncDrawable); task.execute(data); } } }
另:layout文件:
<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" tools:context=".MainActivity" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" > </ListView> </RelativeLayout>
子布局: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="vertical" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
上述表述也很详细,这里就不罗列了。
相关文章推荐
- JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
- 14天学会安卓开发(第三天)UI事件处理与布局管理
- 面试题汇总--数据储存/应用程序/UI控件/客户端的安全性与框架处理。。。
- 在Python中处理日期和时间的基本知识点整理汇总
- 安卓webView开发使用及加载html标签乱码处理
- android UI进阶之实现listview的分页加载 处理加载完毕
- 学徒的时候安卓老知识点总结汇总 (新手应该大概了解的)
- 【安卓知识点汇总】Dialog和Toast封装
- 安卓处理Html----图片异步加载
- 深入安卓大图片处理机制,本地及网络图片不加载到内存预压缩
- 安卓加载缓存处理库的使用
- 安卓知识点汇总
- android调用系统相机和相册进行拍照裁剪处理,解决不同安卓版本存在无法加载相册的问题,处理了是否有sd卡的存在的情况
- 【安卓知识点汇总】 手机拍照上传照片
- 在Python中处理日期和时间的基本知识点整理汇总
- UI- 不易记知识点汇总
- 安卓图片加载汇总(Glide、Picasso)
- 【安卓知识点汇总】自定义View篇:实现统计图
- AngularJS 路由服务器的 resolve用法处理ui抖动和按需加载
- 安卓ListView图片异步加载错位的处理