Слабые ссылки и обработчик в Android

Я просто пытался выяснить, смогу ли я получить исключение NULL-указателя с помощью следующего кода. Причина может заключаться в следующем: проверка выполняется во время X. Но я отправляю исполняемый файл обработчику, он будет выполняться в X+5. У него должна быть сильная ссылка, поэтому он не должен быть промежуточным.

Я прав? (то, что я называю легкой репутацией, ДА достаточно. А нет, вы должны объяснить:-)

public class WeakRunnableUiList
{
    private ArrayList<WeakReference<Runnable>> _items = new ArrayList<WeakReference<Runnable>>();
    private Handler _handler = new Handler(Looper.getMainLooper());

    public void Add(Runnable r)
    {
        _items.add(new WeakReference<Runnable>(r));
    }

    public void Execute()
    {
        ArrayList<WeakReference<Runnable>> remove = new ArrayList<WeakReference<Runnable>>();
        for (WeakReference<Runnable> item : _items)
        {
            if (item.get() == null)
            {
                remove.add(item);
            }
            else
            {
                _handler.post(item.get());
            }
        }
        _items.removeAll(remove);
    }
}

1 ответ

Решение

У него должна быть сильная ссылка, поэтому он не должен быть запущен между

Нет. Поместите это в свой код прямо перед _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!

Таким образом, исполняемый файл может получить значение NULL после вашей первой проверки!

Сделай это так:

Runnable r=item.get();
if (r==null) ...

Но вы можете отправлять пустые значения в обработчики: _handler.post(null);, и он не будет выбрасывать нулевой указатель на самом деле.

Другие вопросы по тегам