Android中的WeakReferences和Handler

时间:2011-12-03 02:25:43

标签: android handler weak-references

我只想弄清楚是否可以使用以下代码获取NULL指针异常。原因可能是:检查在X时刻完成。但是,我将runnable发布到处理程序,他将在X + 5执行。他应该有一个强有力的参考,因此阻止了Runnable之间的gc-ed。

我说错了吗? (我称之为简单的声誉,是的就足够了。不,你必须解释: - )

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 :(得分:0)

  

他应该有一个强大的参考,因此阻止了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);,它实际上不会抛出nullpointer。