转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47281055

在上一篇博文《Android之——杀死用户选中的进程(释放进程占用的空间)》一文中,向大家介绍了如何杀死用户选中的进程,但是,遗留了一个问题,那就是杀死进程后,ListVIew列表没有立即刷新,这篇文章我们就来解决这个问题,优化一下ListView的显示,提升用户体验。我们这篇博文同样是基于上一篇博文来进行优化的,请大家先阅读上一篇博文《Android之——杀死用户选中的进程(释放进程占用的空间)》

一、原理

这里,我们主要优化的是TaskManagerActivity类中自定义的适配器类,在这个自定义适配器类中,我们增加了一个属性字段List<TaskInfo> infos,这个集合代表的是当前要显示到ListView中的数据集合,同时为这个集合设置一个set方法,当其他地方对数据集合进行了更改的时候,比如,添加或者移出了集合中的数据,只要调用自定义适配器的set方法即可将更新后的list集合传递到自定义适配器类中,同时,调用ListView的notifyDataSetChanged()方法即可刷新ListView页面。

二、实现

1、更新自定义适配器TaskManagerAdapter

在这个自定义适配器类中,我们增加了一个属性字段List<TaskInfo> infos,这个集合代表的是当前要显示到ListView中的数据集合,同时为这个集合设置一个set方法,当其他地方对数据集合进行了更改的时候,比如,添加或者移出了集合中的数据,只要调用自定义适配器的set方法即可将更新后的list集合传递到这个自定义适配器类中。

具体实现代码如下:

/*** 自定义适配器* @author liuyazhuang**/private class TaskManagerAdapter extends BaseAdapter{private LayoutInflater mInflater;private List<TaskInfo> infos;public void setInfos(List<TaskInfo> infos) {this.infos = infos;}public TaskManagerAdapter(){mInflater = getLayoutInflater();}@Overridepublic int getCount() {return infos.size();}@Overridepublic Object getItem(int position) {return infos.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view = null;ViewHolder holder = null;if(convertView != null){view = convertView;holder = (ViewHolder) view.getTag();}else{view = mInflater.inflate(R.layout.task_manager_item, null);holder = new ViewHolder();holder.iv_task_manager_icon = (ImageView) view.findViewById(R.id.iv_task_manager_icon);holder.iv_task_manager_name = (TextView) view.findViewById(R.id.tv_task_manager_name);holder.iv_task_manager_memory = (TextView) view.findViewById(R.id.tv_task_manager_memory);//获取到UI上的CheckBox控件holder.cb_task_manager_selected = (CheckBox) view.findViewById(R.id.cb_task_manager_selected);view.setTag(holder);}TaskInfo taskInfo = infos.get(position);holder.iv_task_manager_icon.setImageDrawable(taskInfo.getTask_icon());holder.iv_task_manager_memory.setText("占用的内存:"+TextFormat.formatByte(taskInfo.getTask_memory()*1024));holder.iv_task_manager_name.setText(taskInfo.getTask_name());String packageName = taskInfo.getPackageName();//应用程序是当前运行的程序if(packageName.equals(getPackageName())){holder.cb_task_manager_selected.setVisibility(View.GONE);}else{holder.cb_task_manager_selected.setVisibility(View.VISIBLE);}//获取条目的选中状态boolean isChecked = taskInfo.isChecked();if(isChecked){holder.cb_task_manager_selected.setChecked(true);}else{holder.cb_task_manager_selected.setChecked(false);}return view;}}

2、更新Handler

这里由于我们更新了自定义适配器类,其中显示的数据设置方式发生了变化,所以,我们也要更新一下默认进程列表的显示方式,我们在Handler实例化自定义适配器类TaskManagerAdapter后,需要手动将进程列表集合set到这个类中的list属性字段中,然后调用ListView的notifyDataSetChanged()方法刷新列表显示。

具体代码如下:

private Handler mHandler = new Handler(){public void handleMessage(android.os.Message msg) {switch (msg.what) {case SUCCESS_GETTASKINFO:long total = TaskUtils.getAvailMem(TaskManagerActivity.this);for(TaskInfo info : taskInfos){total += info.getTask_memory() * 1024;}//可用内存String availMemStr = TextFormat.formatByte(TaskUtils.getAvailMem(TaskManagerActivity.this));//总内存String totalMemStr = TextFormat.formatByte(total);tv_task_manager_task_memory.setText("可用/总内存:"+availMemStr+"/"+totalMemStr);mAdapter = new TaskManagerAdapter();mAdapter.setInfos(taskInfos);rl_loading.setVisibility(View.GONE);lv_taskmanage.setAdapter(mAdapter);break;default:break;}};};

3、更新“一键清理”的点击事件

在这个方法中,我们新创建了一个list集合,用来存放没有被杀死的进程,处理完后,将这个没有被杀死的进程集合set给自定义适配器类TaskManagerAdapter的list集合,然后调用ListView的notifyDataSetChanged()方法刷新列表显示。

注意:遍历集合的时候,是不能对集合进行增、删、改操作的。

具体代码如下:

/*** 杀死进程* @param v*/public void kill_process(View v){//存放没有被杀死的进程List<TaskInfo> newTaskInfos = new ArrayList<TaskInfo>();for(TaskInfo taskInfo : taskInfos){if(taskInfo.isChecked()){//杀死选中的进程am.killBackgroundProcesses(taskInfo.getPackageName());}else{newTaskInfos.add(taskInfo);}}mAdapter.setInfos(newTaskInfos);mAdapter.notifyDataSetChanged();}

三、运行效果

四、温馨提示

本实例中,为了方面,我把一些文字直接写在了布局文件中和相关的类中,大家在真实的项目中要把这些文字写在string.xml文件中,在外部引用这些资源,切记,这是作为一个Android程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。

Android之——杀死用户选中的进程优化相关推荐

  1. Android超越iOS用户体验改进之安卓优化趋势

    根据权威智能手机操作系统的排名,Android.iOS是当今最受欢迎的智能手机操作系统.苹果公司的iOS是Android的最大竞争对手,从有用.易用.友好.视觉设计和品牌这五个用户体验设计目标来看,i ...

  2. 量化和优化Android设备的用户体验

    (本文为作者李晓峰原创,英文版原文发表在http://software.intel.com/en-us/articles/quantify-and-optimize-the-user-interact ...

  3. android 杀进程 方法,android中杀死进程的方法

    第一种方法:这个方法只能自杀,不能杀死其他进程~ /**************************************************** *            杀死进程的第一种 ...

  4. 杀掉php所有进程,杀死某个用户的所有进程

    在一台100多人使用的 SUN 服务器上经常发现有人滥用资源,平时用用就算了,到了交作业的时候100多号人同时登录使用,服务器明显迟缓,特别是实验室用的是瘦客户机,没硬盘,SUN 客户端需要从服务器装 ...

  5. android 用户反馈界面,如何通过用户反馈实现产品优化——以「foodie」APP为例

    用户反馈尤其是低分评价,非常需要产品方注意和甄别.通过分析用户反馈,可以更好地了解产品自身.竞品威胁以及未来的机会点等,从而帮助产品更高效地迭代.本文以「foodie」为例,阐述了如何有效搜集用户反馈 ...

  6. Android 后台杀死及恢复的机制

    App在后台久置后,再次从桌面或最近的任务列表唤醒时经常会发生崩溃,这往往是App在后台被系统杀死,再次恢复的时候遇到了问题,而在使用FragmentActivity+Fragment的时候,经常会遇 ...

  7. Android后台杀死系列之三:LowMemoryKiller原理(4.3-6.0)

    本篇是Android后台杀死系列的第三篇,前面两篇已经对后台杀死注意事项,杀死恢复机制做了分析,本篇主要讲解的是Android后台杀死原理.相对于后台杀死恢复,LowMemoryKiller原理相对简 ...

  8. Android后台杀死系列之二:ActivityManagerService与App现场恢复机制

    本篇是Android后台杀死系列的第二篇,主要讲解ActivityMangerService是如何恢复被后台杀死的进程的(基于4.3 ),在开篇 FragmentActivity及PhoneWindo ...

  9. Android系统(245)---SystemServer进程的创建流程

    Android进程系列第三篇---SystemServer进程的创建流程 一.内容预览 SystemServer进程的启动.png 二.概述 前面进程系列已经更新了两篇,本文(基于Android O源 ...

  10. Android 天气APP(九)细节优化、必应每日一图

    上一篇:Android 天气APP(八)城市切换 之 自定义弹窗与使用 重新定位.必应每日一图 新版------------------- 一.封装定位 二.重新定位 三.必应每日一图 ① 添加必应接 ...

最新文章

  1. JS 添加网页桌面快捷方式的代码
  2. 王木匠,我服了你一半
  3. Can't create layer 289 of type Squeeze in function 'cv::dnn::dnn4_v20190902::LayerData::getLaye
  4. python中BeautifulSoup简单使用
  5. 【转】Java 内存模型及GC原理
  6. 台式计算机机箱的作用,如何选择台式电脑机箱?小白安装电脑机箱常识指南
  7. 研制一个生产计划编制的软件
  8. iOS 为tableview添加新的cell类
  9. window环境配置虚拟主机
  10. 地方命令SqlServer2008中解决在表上点右键把【编辑前200行】变成【编辑前10000行】的方法!...
  11. 手把手教你写一个web聊天室之bookstap框架
  12. 盘姬工具箱 Cruiser EXP for Win v1.1.0 多功能系统工具箱
  13. PC软件标题修改器 支持加壳
  14. 【Linux云计算架构:第三阶段-Linux高级运维架构】第23章—— Linux手动木马查杀过程
  15. 【JS逆向系列】某服务器平台sm系列算法分析
  16. Android Room 数据访问对象(DAO)详解
  17. Emacs配置管理框架Cabbage – 介绍
  18. 给学弟学妹肝的一篇Java学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer
  19. 哪些能恢复网站服务器的数据的方式呢?
  20. 基于STM32C8T6语音数字的播报小算法

热门文章

  1. dim c语言,编程基础-C程序的组成
  2. sql 的 desc和asc用法
  3. 使用Python绘制热图的库 pyHeatMap 使用Python绘制热图的库 pyHeatMap
  4. 接口测试+自动化接口测试详解入门到精通
  5. 使用meshBaker合并多个mesh进行优化
  6. Flashpaper序列号
  7. VM虚拟机 运行UEFI程序
  8. 项目管理:名词解释、区别联系、案例分析
  9. Android 手表WearOs 禁止滑动返回、监听滑动事件分发
  10. PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)