位置: 编程技术 - 正文

android 手把手教你照片墙应用实现,再多的图片也不怕OOM(android怎么样)

编辑:rootadmin

推荐整理分享android 手把手教你照片墙应用实现,再多的图片也不怕OOM(android怎么样),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:安卓手机教程视频,android教程视频教程,android教程手册,android教学,安卓入门教程,android教程视频教程,安卓 教程,android教程视频教程,内容如对您有帮助,希望把文章链接给更多的朋友!

今天讲一个照片墙的应用,这个在去年还算是比较流行的,现在不忙,也准备简单的实现以下,之所以说是照片墙是好像图片加载出来后贴上去的感觉,这个用GridView控件,然后加载出来的图片放上去即可!

实现原理:

1:去重复 相同的url不要下载二次,可以用set集合对封装的任务,但是我们应用使用了内存缓存即使不做判断也不会加载二次,因为LruCache对象已经帮我们实现了

2:下载图片的任务使用了AsyncTask

3:当我们快速滑动屏幕的时候 怎么做到当手指松开的时候才加载可见屏幕范围对应的图片 避免了快速滑动导致卡的问题

android  手把手教你照片墙应用实现,再多的图片也不怕OOM(android怎么样)

在这些例子中使用到了很多图片,这些图片都是我从豆瓣网上辛苦的搞过来的,copy也是体力活啊,不容易,给自己点个赞

首先看下activity_main.xml 很简单就一个GridView控件

Constan.java存放图片

具体的业务逻辑全部在ImageLoadAdapter中

package com.example.zgzphotodemo.adapter;import java.io.IOException;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.util.HashSet;import java.util.Set;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.support.v4.util.LruCache;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.ImageView;import com.example.zgzphotodemo.Constan;import com.example.zgzphotodemo.R;public class ImageLoadAdapter extends BaseAdapter implements OnScrollListener {private Activity activity;private GridView gv;private LayoutInflater inflater;/*** 图片缓存技术的核心类,用于缓存所有下载好的图片,在程序内存达到设定&#;时会将最少最近使用的图片移除掉。*/private LruCache<String, Bitmap> mMemoryCache;/*** 记录所有正在下载或等待下载的任务。*/private Set<ImageLoadTask> imageLoadTasks;/*** 第一张可见图片的下标*/private int mFirstVisibleItem;/*** 可见区域一屏有多少张图片*/private int mVisibleItemCount;/*** 代表第一次进来不滑动的时候自动加载图片*/private boolean isFirstLoad = true;public ImageLoadAdapter(GridView gv,Activity activity){this.activity = activity;this.gv = gv;inflater = LayoutInflater.from(activity);imageLoadTasks = new HashSet<ImageLoadAdapter.ImageLoadTask>();/*** 获取应用给app分配的内存空间*/int maxMemory = (int) Runtime.getRuntime().maxMemory();/*** 给图片分配合理的内容空间*/int cacheSize = maxMemory / 8;mMemoryCache = new LruCache<String, Bitmap>(cacheSize){@Overrideprotected int sizeOf(String key, Bitmap bitmap) {return bitmap.getByteCount();}};gv.setOnScrollListener(this);}@Overridepublic int getCount() {return Constan.imgs!=null&&Constan.imgs.length>0?Constan.imgs.length:0;}@Overridepublic Object getItem(int position) {return Constan.imgs[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup arg2) {final String url = (String) getItem(position);ViewHolder holder = null;if(convertView==null){convertView = inflater.inflate(R.layout.img_item, null);holder = new ViewHolder();holder.imageview = (ImageView) convertView.findViewById(R.id.imageview);convertView.setTag(holder);}else{holder = (ViewHolder) convertView.getTag();}/*** 给ImageView设置一个Tag,保证异步加载图片时不会乱序*/holder.imageview.setTag(url);setImageView(url, holder.imageview);return convertView;}/*** 首先用url到缓存中找 如果没有就显示默认图片 如果缓存中有 就显示* @param url 要显示图片的url* @param imageview */private void setImageView(String url, ImageView imageview) {Bitmap bitmap = mMemoryCache.get(url);if(bitmap!=null&&imageview!=null){imageview.setImageBitmap(bitmap);}else{imageview.setImageResource(R.drawable.empty_photo);}}class ViewHolder{ImageView imageview;}/*** view 就是GridView* firstVisibleItem 可见 第一个条目* visibleItemCount 可见的总条目* totalItemCount 要加载的总条目*/@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {mFirstVisibleItem = firstVisibleItem;mVisibleItemCount = visibleItemCount;if (isFirstLoad && visibleItemCount > 0) {loadImages(firstVisibleItem, visibleItemCount);isFirstLoad = false;}}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {// 仅当GridView静止时才去下载图片,GridView滑动时取消所有正在下载的任务if (scrollState == SCROLL_STATE_IDLE) {loadImages(mFirstVisibleItem, mVisibleItemCount);} else {cancelAllTasks();}}private void cancelAllTasks() {if (imageLoadTasks != null) {for (ImageLoadTask task : imageLoadTasks) {task.cancel(false);}}}private void loadImages(int firstVisibleItem, int visibleItemCount) { for(int i=firstVisibleItem;i<firstVisibleItem&#;visibleItemCount;i&#;&#;){ String imagUrl = Constan.imgs[i]; Bitmap bitmap = getBitmapFromMemory(imagUrl); if(bitmap==null){//从网络获取 ImageLoadTask task = new ImageLoadTask(); imageLoadTasks.add(task); task.execute(imagUrl); }else{//从缓存获取 ImageView imageView = (ImageView) gv.findViewWithTag(imagUrl);if (imageView != null && bitmap != null) {imageView.setImageBitmap(bitmap);} } }}private Bitmap getBitmapFromMemory(String key) {return mMemoryCache.get(key);}class ImageLoadTask extends AsyncTask<String, Void, Bitmap>{String url = null;@Overrideprotected Bitmap doInBackground(String... param) {url = param[0];/*** 从网络上加载的图片 如果bitmap不为null 就加载到内存之中*/Bitmap bitmap = downLoadImage(url);if (bitmap != null) {// 图片下载完成后缓存到LrcCache中addBitmapToMemoryCache(url, bitmap);}return bitmap;}@Overrideprotected void onPostExecute(Bitmap bitmap) {super.onPostExecute(bitmap);ImageView imageView = (ImageView) gv.findViewWithTag(url);if (imageView != null && bitmap != null) {imageView.setImageBitmap(bitmap);}/*** 下载完了以后把该任务从集合中移除 可能有些人会说为什么要用hashset集合 因为他可以的任务不重复*/imageLoadTasks.remove(this);}}public Bitmap downLoadImage(String imgUrl) {Bitmap bitmap = null;HttpURLConnection conn = null;try {URL url = new URL(imgUrl);conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5 * );conn.setReadTimeout( * );conn.setDoInput(true);bitmap = BitmapFactory.decodeStream(conn.getInputStream());} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (conn != null) {conn.disconnect();}}return bitmap;}/*** 把图片加载到内存之中* @param url 图片的url* @param bitmap url对应的图片*/public void addBitmapToMemoryCache(String url, Bitmap bitmap) {if (getBitmapFromMemory(url) == null) {mMemoryCache.put(url, bitmap);}}}

效果图:

Android系统触屏事件传递派发浅析(二) 上一篇文章提到在InputDispatcher中,connection调用inputPublisher.publishMotionEvent后分发就完成了,然后将dispatchEntry放入到waitQueue队列,大概是有的事件必须等应

Intent and Intent Filters 转载请注明出处:

Android 常用适配器总结 一,适配器.顾名思义,就是把一些数据给弄得适当,适合以便于在View上显示。可以看作是界面数据绑定的一种理解。它所操纵的数据一般都是一些比较

标签: android怎么样

本文链接地址:https://www.jiuchutong.com/biancheng/378157.html 转载请保留说明!

上一篇:Android: AudioFlinger中AudioPolicy的简单介绍

下一篇:Android系统触屏事件传递派发浅析(二)(android触屏事件的处理)

  • 商品开票是什么意思
  • 费用性税金计入什么科目
  • 境内公司代付境外货款
  • 简易计税的进项可以抵扣吗
  • 抵扣联的抵扣期限
  • 自己可以缴纳社保吗
  • 公司对公账户限额吗
  • 银行承兑汇票背书可以拆分
  • 小微企业免征税怎么做会计分录
  • 公司向个人租房子怎么做账
  • 电子承兑背书失败是怎么回事
  • 垫资后转出的会计分录怎么写?
  • 发票额开多了多出的金额怎么处理?
  • 债券分期还本利息怎么算
  • 经营性租出固定资产的租金收入计入
  • 土地增值税清算时间
  • 处置交易性金融资产发生的交易费用
  • 软件开发票入研发费用哪个明细科目?
  • 本月出口下月开发票可以吗
  • 报税没有申报现金流量表
  • 小规模纳税人未建账处罚
  • 原材料增值税怎么算
  • 暂估入库的货物销售了当月多交增值税了
  • 物料买回来再发货可以吗
  • 申报工会经费怎么做账
  • 税金及附加包括地方教育费附加吗
  • 进项票税率不同怎么处理
  • 新公司会计建账流程
  • 远期汇票的付款期限可以表示为
  • 若依前后端分离需要准备啥
  • 应收账款保理会计处理 会计视野
  • 视频监控维护
  • vmware10虚拟机安装
  • php货币换算人民币
  • 深入浅出stm8
  • 冲往年管理费用的账务处理是否涉及所得税
  • 个人减免税政策6条
  • 劳务派遣发票会扣税吗
  • vue写css
  • PHP:imagecopymerge()的用法_GD库图像处理函数
  • wordpress优化seo
  • 货物发生非正常损失为什么要做j进项转出
  • 图片防止侵权怎么写
  • win11设置项改中文
  • 注册公司填写从业人数多少合适
  • 企业所得税申报表在哪里打印
  • 新购固定资产怎么填写申报表
  • 公司的资金管理模式是什么?
  • 新租赁准则承租人租金用什么科目
  • 期末留抵退税计算公式
  • 运输公司发票抵扣
  • 购进商品用于销售
  • 销售退回的账务处理会计分录
  • 借资本公积贷递延所得税负债是什么意思
  • 员工话费实报实销分录
  • 固定资产清理贷方余额是什么意思
  • 人工工资会计科目
  • a公司刚刚执行了一个采购项目
  • 实收资本是什么公司
  • 安全升级
  • centos7.6 yum源
  • xp系统找不到指定的路径怎么办
  • windows server 2008 r2离线激活
  • ubuntu系统中安装微信步骤
  • 笔记本没有光驱怎么加装固态硬盘
  • Ubuntu安装VMware tools
  • linux系统中安装软件的批处理文件
  • xp显示文件后缀怎么设置
  • centos怎么安装
  • pavkre.exe - pavkre是什么进程 作用是什么
  • win8无法关机一直转圈
  • linux系统问题汇总
  • javascript中的数字型可以用来保存整数或浮点数(小数)
  • node 进程
  • cacls命令怎么运用
  • jquerybind事件
  • javascript如何禁用
  • 教师票优惠需要交税吗
  • 河南省单位怎么打印社保花名册
  • 福建农村社保一个月可以拿多少钱
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设