Android之——杀死用户选中的进程优化
转载请注明出处: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程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。
更多相关文章
- [置顶] AIDL使用以及原理分析
- Android(安卓)外观模式
- 对在Android的状态栏添加Menu,Back,Home的改进
- Android(安卓)IPC机制(二)——利用Messenger实现跨进程通信
- Android(安卓)Bluetooth 蓝牙开发资料大全【新】
- Android的SQLite使用实例
- Java集合框架——Android中的ArrayList源码分析
- Android之路之十七(重要组件之Service)
- Fedora17 64位 android "failed to create the SD card" 解决方