2012-06-08 2 views
1

Прямо сейчас у меня есть LinkedList из намерений в IntentService, который отслеживает, какие намерения находятся в очереди от Service. Я нахожу, что метод никогда не возвращается true, даже для идентичных намерений. Есть ли что-то еще, что я должен сделать, чтобы сравнить два намерения?Как сравнить два намерения для равенства

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    if(queue.contains(intent)){ 
        //Never reaches here 
     intent.setAction(NO_ACTION); 
    } 
    queue.push(intent); 
    return super.onStartCommand(intent, flags, startId); 
} 

Пример кода для отправки Намерение:

Intent i = new Intent(context, NodeIndexService.class); 
    i.setAction(NodeIndexService.REFRESH); 
    i.putExtra(NodeIndexService.TYPE, indexType); 
    i.putExtra(NodeIndexService.RESULT_RECEIVER, receiver); 
    context.startService(i); 

Два Intents посылают один за другим с этим кодом должны быть идентичны, нет? Контекст не меняется, а дополнительные параметры одинаковы.

+0

Что вы имеете в виду под «идентичных» намерений? Вам нужно будет определить, что значит для них быть равным, иначе это будет просто идентификация объекта. –

+1

«Идентичность» означает одно и то же действие, тип и дополнительные функции. Я предположил, что если бы два намерения были уволены с этими параметрами, равными по соответствующему Intent, equals() вернет true. – SeanPONeil

ответ

5

Вы должны определить свой собственный equals метод в соответствии с вашими критериями равенства, какими бы они ни были.

Согласно Intent API docs метод equals определяется как Object - простой идентификатор.

Это более или менее стандартный стандарт Java; посмотрите, определяет ли класс его собственное равенство, если это не так, вам нужно создать свой собственный - с оговоркой, что в любой среде, в которой находятся экземпляры, может также проверить равенство, поэтому платит за реализацию equals и hashCodeправильно.

(Если вы определяете equals, вы хотите, чтобы определить hashCode для полноты картины.)


Ваш код специально создает новые намерения - это то, что делает new.

Вы создаете два объекта: идентификатор объекта означает, видя, если две ссылки ссылаются на тот же объект, не если произвольные свойства одинаковы. Если вы хотите сравнить на основе произвольных критериев, вам необходимо определить свой собственный метод equals, который будет выполнять ваши сравнения.

+0

Я думаю, лучший вопрос был бы в том, почему мои намерения не возвращаются true при использовании метода equals(). Если я не изменю действие, тип, дополнительные функции или контекст, почему они не равны? – SeanPONeil

+2

@ oneilse14 Потому что это не тот же экземпляр - это то, что означает идентификатор объекта. –

+0

so equals() сравнивается для идентификации. Есть ли способ сравнения для равенства объектов, даже если они не являются одним и тем же экземпляром? – SeanPONeil

0

Не могли бы вы сделать что-то вроде этого?

Object ob1 = (Object) intent1; 
Object ob2 = (Object) intent2; 

if(ob1.equals(ob2)) 

выше только тогда станет истинным, если все о них то же самое

Есть ли какие-либо конкретные части намерений, которые вы хотите сравнить?


if(intent1.getAction().equals(intent2.getAction()) && intent1.getType().equals(intent2.getType()) && 
    intent1.getExtras().equals(intent2.getExtras())) 
+1

http://grepcode.com/file/repository.grepcode.com/java/root/jd//ru/openjdk/6-b14/java/util/AbstractCollection.java#AbstractCollection.contains%28java.lang.Object%29 – SeanPONeil

+0

Это что 'contains' делает, если нет компаратора. –

+0

Метод contains() делает именно это – SeanPONeil

6

Там есть способ определенно сравнить намерения - filterEquals(): http://developer.android.com/reference/android/content/Intent.html#filterEquals(android.content.Intent)

Похоже, фактически с теми же данными, категории и действия будут рассматриваться как равные при использовании этого метода.

+0

Именно то, что я искал, спасибо. – SeanPONeil

+1

@oneilse Хорошо, но это не то, что вы сказали в своем комментарии - это сравнивает больше полей и, в частности, * не сравнивает лишние данные, которые вы установили, и говорит, что вас беспокоит, поэтому пользовательский эквивалент. –

+0

А хорошая точка. Я приму свой ответ – SeanPONeil

-1

Здесь я сравниваю два намерения с помощью компаратора (в модульном тесте с использованием FEST):

import static org.fest.assertions.api.Assertions.assertThat; 

assertThat(intentOne).usingComparator(new IntentComparator()).isEqualTo(intentTwo); 

private static class IntentComparator implements Comparator<Intent> { 
    @Override 
    public int compare(Intent left, Intent right) { 
     return left.filterEquals(right) ? 0 : 1; 
    } 
} 
Смежные вопросы