您的位置:首页 > 移动开发 > Android开发

Android之——杀死用户选中的进程优化

2015-08-04 19:29 381 查看
转载请注明出处:/article/8380837.html

在上一篇博文《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();
}
@Override
public int getCount() {
return infos.size();
}

@Override
public Object getItem(int position) {
return infos.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public 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程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: