我只想弄清楚是否可以使用以下代码获取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);
}
}
答案 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。