標籤: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();}@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之——殺死使用者選中的進程最佳化