2016-03-23 25 views
0

numaralı kutu tipini işaretlerken işe yaramaz (Not: İlk sürümüm hatalı olduğundan sorumu yeniden yazdım).android.os.Handler.removeMessages, msg.obj

Aşağıdaki kodu verilen:

Handler handler = new Handler(); 
Message msg = handler.obtainMessage(12345, 67890L); 
handler.sendMessageDelayed(message, 10000); 
... 
handler.removeMessages(12345, 67890L); 

sorun bunu gönderdikten sonra mesajı hala 10 saniye ateşler olmasıdır!

Neden "handler.removeMessages" iletisi kaldırılıyor?

cevap

1

Sorun, uzun bir Uzun Nesnenin otomatik kutusu. hat 643 At

638: // Remove all messages after front. 
639: while (p != null) { 
640:  Message n = p.next; 
641:  if (n != null) { 
642:   if (n.target == h && n.what == what 
643:    && (object == null || n.obj == object)) { 
644:    Message nn = n.next; 
645:    n.recycleUnchecked(); 
646:    p.next = nn; 
647:    continue; 
648:   } 
649:  } 
650:  p = n; 
651: } 

: o örneklerini karşılaştıran çünkü

object = {[email protected]} "67890" 
n.obj = {[email protected]} "67890" 

Yani, benim durumumda karşılaştırma her zaman başarısız olur ve benim kutulu değer örneklerini her zaman MessageQueue void removeMessages(Handler h, int what, Object object) ait debugger olarak

farklı.

LongSparseArray<Long> objects = new LongSparseArray<>(); 
Handler handler = new Handler(); 

void sendMessageDelayed(int what, long key, long delayMillis) 
{ 
    Object obj = key; 
    objects.put(key, object); 

    Message msg = handler.obtainMessage(what, obj); 
    handler.sendMessageDelayed(message, delayMillis); 
} 

void removeMessages(int what, long key) 
{ 
    Object obj = objects.remove(key); 
    if (obj != null) 
    { 
     handler.removeMessages(what, key); 
    } 
} 

sendMessageDelayed(12345, 67890L, 10000); 
... 
removeMessages(12345, 67890L); 

PV

:

// Remove all messages after front. 
while (p != null) { 
    Message n = p.next; 
    if (n != null) { 
     if (n.target == h && n.what == what 
      && (object == null || object == n.obj || object.equals(n.obj))) { 
      Message nn = n.next; 
      n.recycleUnchecked(); 
      p.next = nn; 
      continue; 
     } 
    } 
    p = n; 
} 

Benim düzeltme böyle bir şey yapmaktır:

Yine de, şu olmayı removeMessages eksik-zarflar uygulanmasını beklerdik