У него должна быть сильная ссылка, поэтому препятствует тому, чтобы Runnable был gc-ed между
Нет.Поместите это в свой код как раз перед _handler.post(...
:
...
byte[] b=new byte[1024*32]; // this can occur in an other thread!
if (item.get() == null) {
Log.e("Item is NULL now!", "Item is NULL now!");
}
_handler.post(item.get());
...
А затем в основной программе:
for(int i=0;i<100;i++) {
weakRunnableUiList.Add(new X());
}
weakRunnableUiList.Execute();
даст вам 12-03 21:56:01.521: E/Item is NULL now!(1071): Item is NULL now!
Так чтоrunnable может получить NULL после вашей первой проверки!
Сделайте это так:
Runnable r=item.get();
if (r==null) ...
Но вы можете отправлять нулевые значения в обработчики: _handler.post(null);
, и он не будет выбрасыватьфактически нулевой указатель.