Слабые ссылки и обработчик в Android - PullRequest
0 голосов
/ 03 декабря 2011

Я просто пытался выяснить, смогу ли я получить исключение 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 Ответ

0 голосов
/ 04 декабря 2011

У него должна быть сильная ссылка, поэтому препятствует тому, чтобы 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);, и он не будет выбрасыватьфактически нулевой указатель.

...