編輯:添加馬特的意見
removeall過的比較對象的指針,而不是內容,這就是爲什麼它是無法找到任何巧合。
您可以通過觀看的
difference.removeAll(oldRunningTaskInfos);
的返回值(假的意思是「無巧合」)
也許最好的辦法是封裝RunningTask成覆蓋平等的對象檢查這個()和hashcode()方法,然後調用removeAll。考慮到做下面的示例代碼相同,但用列表的:
// Getting two snapshots
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> oldRunningTasks=am.getRunningTasks (100);
List<ActivityManager.RunningTaskInfo> newRunningTasks=am.getRunningTasks (100);
// We add a new fake task to test that removeAll() is working
ActivityManager.RunningTaskInfo fakeTask=new ActivityManager.RunningTaskInfo();
fakeTask.baseActivity=new ComponentName("Fake","Fake");
fakeTask.id=1234;
newRunningTasks.add(fakeTask);
// Converting to lists of Comparable objects and get the differences.
List<RunningTaskInfoComparable> list_difference = convertToComparable(newRunningTasks);
List<RunningTaskInfoComparable> list_oldRunningTaskInfos = convertToComparable(oldRunningTasks);
boolean res=list_difference.removeAll(list_oldRunningTaskInfos);
for(RunningTaskInfoComparable d : list_difference){
ComponentName cn = d.getBaseActivity();
Log.d("com.test.tasks","Comparing List: " + cn.getPackageName() + "****" + cn.getClassName() + "****" + cn.getShortClassName());
}
其中RunningTaskInfoComparable是這樣實現的:
public class RunningTaskInfoComparable {
android.app.ActivityManager.RunningTaskInfo runningTaskObject;
public RunningTaskInfoComparable (android.app.ActivityManager.RunningTaskInfo obj)
{
runningTaskObject=obj;
}
// Observer
public ComponentName getBaseActivity(){
return runningTaskObject.baseActivity;
}
@Override
public int hashcode()
{
int result = HashCodeUtil.SEED;
// More data could be added to the hash...
result = HashCodeUtil.hash(result, runningTaskObject.id);
return result;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof RunningTaskInfoComparable)) {
return false;
}
// Criteria: Same task id means same entity
return (runningTaskObject.id==((RunningTaskInfoComparable)obj).runningTaskObject.id);
}
}
和convertToComparable樣子:
private List<RunningTaskInfoComparable> convertToComparable (List<ActivityManager.RunningTaskInfo> _original)
{
List<RunningTaskInfoComparable> retList=new ArrayList<RunningTaskInfoComparable>();
for(RunningTaskInfo t : _original){
RunningTaskInfoComparable tc = new RunningTaskInfoComparable(t);
retList.add(tc);
}
return retList;
}
我覺得代碼ok:它返回newRunningTasks中的所有RunningTaskInfo-s,它們在oldRunningTaskInfos中沒有_equal_對象。 在newRunningTasks,oldRunningTasks中輸出所有值以進行檢查。 – Oliv 2012-03-16 07:51:29
似乎非常感謝 – manugupt1 2012-03-16 11:26:36