码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-08-04 21:12:50      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:android   进程   优化   用户体验   listview   

转载请注明出处: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();
		}
		@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程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:android   进程   优化   用户体验   listview   

原文地址:http://blog.csdn.net/l1028386804/article/details/47281055

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!