2011-12-03 14 views
0

次のコードでNULLポインタ例外が発生するかどうかを調べようとしていました。原因はこれかもしれない:チェックは時刻Xで行われる。しかし、私はハンドラに実行可能ファイルをポストし、彼はX + 5で実行する。彼は強力な参照を持っている必要があり、その間にRunnableがgc-edされないようにします。AndroidのWeakReferencesとHandler

正しいですか? (。Aはありません、あなたは彼がゆえの間での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

:-)説明しなければならないものを、私は簡単に評判を呼び出し、YESが十分であること

... 
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()); 
... 

そしてメインPROGRで:あなたのコードにこれを入れて

号 だけ_handler.post(...前午前:

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) ... 

しかし、あなたはハンドラにNULLを投稿することができます:_handler.post(null);を、そしてそれが実際にnullポインタをスローしません。

+0

ありがとう、お勧めしますが、ハンドラがNULLに対応していれば、とにかく心配する必要はありません。しかし、最後の行は、NULLを取得しないようにしなければならない場合のベストプラクティスのように見えます。 –