Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android之——殺死用戶選中的進程優化

Android之——殺死用戶選中的進程優化

編輯:關於Android編程

 

在上一篇博文《Android之——殺死用戶選中的進程(釋放進程占用的空間)》一文中,向大家介紹了如何殺死用戶選中的進程,但是,遺留了一個問題,那就是殺死進程後,ListVIew列表沒有立即刷新,這篇文章我們就來解決這個問題,優化一下ListView的顯示,提升用戶體驗。我們這篇博文同樣是基於上一篇博文來進行優化的,請大家先閱讀上一篇博文《Android之——殺死用戶選中的進程(釋放進程占用的空間)》

一、原理

這裡,我們主要優化的是TaskManagerActivity類中自定義的適配器類,在這個自定義適配器類中,我們增加了一個屬性字段List infos,這個集合代表的是當前要顯示到ListView中的數據集合,同時為這個集合設置一個set方法,當其他地方對數據集合進行了更改的時候,比如,添加或者移出了集合中的數據,只要調用自定義適配器的set方法即可將更新後的list集合傳遞到自定義適配器類中,同時,調用ListView的notifyDataSetChanged()方法即可刷新ListView頁面。

二、實現

1、更新自定義適配器TaskManagerAdapter

在這個自定義適配器類中,我們增加了一個屬性字段List infos,這個集合代表的是當前要顯示到ListView中的數據集合,同時為這個集合設置一個set方法,當其他地方對數據集合進行了更改的時候,比如,添加或者移出了集合中的數據,只要調用自定義適配器的set方法即可將更新後的list集合傳遞到這個自定義適配器類中。

具體實現代碼如下:

 

/**
	 * 自定義適配器
	 * @author liuyazhuang
	 *
	 */
	private class TaskManagerAdapter extends BaseAdapter{
		private LayoutInflater mInflater;
		private List infos;
		
		public void setInfos(List 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 newTaskInfos = new ArrayList();
		for(TaskInfo taskInfo : taskInfos){
			if(taskInfo.isChecked()){
				//殺死選中的進程
				am.killBackgroundProcesses(taskInfo.getPackageName());
			}else{
				newTaskInfos.add(taskInfo);
			}
		}
		mAdapter.setInfos(newTaskInfos);
		mAdapter.notifyDataSetChanged();
	}

 

三、運行效果

height=315

height=349

四、溫馨提示

本實例中,為了方面,我把一些文字直接寫在了布局文件中和相關的類中,大家在真實的項目中要把這些文字寫在string.xml文件中,在外部引用這些資源,切記,這是作為一個Android程序員最基本的開發常識和規范,我在這裡只是為了方便直接寫在了類和布局文件中。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved