2012-02-18 16 views
3

次のコードでは非常に多くの問題がありますが、エラーは表示されず、表示されます。NullPointerExceptionがスローされない

  1. btn3.setText( "fud"); NullPointerExceptionをスローする必要があります。それはしません。
  2. UI以外のスレッドからUI要素を変更できないようにしてください。私はすることができ、アンドロイドはそれについて不平を言うことはありません。

ここでは何が起こっていますか?

public class TestApp1Activity extends Activity { 

private static final String TAG = TestApp1Activity.class.getSimpleName(); 
private Button btn1, btn2, btn3; 
private ExecutorService threadPool; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    btn1 = (Button)findViewById(R.id.button1); 
    btn2 = (Button)findViewById(R.id.button2); 

    threadPool = Executors.newFixedThreadPool(4); 
    threadPool.submit(new Runnable() { 
     @Override 
     public void run() { 
      btn3.setText("fud"); // should give a NullPointerException. Doesn't only stops execution. 
      btn2.setText("From pool"); // shouldn't be able to touch UI comps from non-UI thread 
     } 
    }); 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      Log.i(TAG, "Before setting text on btn"); 
      btn1.setText("From thread"); // shouldn't be able to touch UI comps from non-UI thread 
      Log.i(TAG, "After setting text on btn"); 

          // So below actually throws the error I wanted. 
      Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.cox1); 
      imageView.setImageBitmap(bm); 
     } 
    }).start(); 
} 
} 

編集:私は悪い答えを取得していますので、私は私自身の質問に答えてみましょう。

  1. ExecutorService.submitは、Runnableをtry/catchでラップします。エラーがスローされた場合は、静かに破棄されます。これはAndroidチームのひどいデザインです... gezzz
  2. 明らかに、別のスレッドからいくつかのビューコンポーネントを変更することができます。ちょうどそれらのすべてではありません。
+0

これはうまく動作しますか?それはあなたに叫んでいませんか? btn2のテキストは実際に変更されますか? –

+0

1.これはおそらく、あなたがスレッドでそれをやっており、メインのUIスレッドがまだ生きているからです(おそらくAndroidに設計されているので、UIは他のスレッドに邪魔されません)。 – Drejc

答えて

2

1)ExecutorService.submitは、Runnableをtry/catchでラップします。エラーがスローされた場合は、静かに破棄されます。これはひどくデザインされています。静かにエラーを抑止するべきではありません。

2)他のスレッドからいくつかのビューコンポーネントを変更することができます。ちょうどそれらのすべてではありません。コンポーネントはそのプロパティを設定するだけで、次のonDrawではコンポーネントが再描画されます。実際には多くのコンポーネントでこれを行うことができますが、Androidチームは「予期せぬ結果を得ることができる」と述べています。だからそれを避けてください。

+0

ExecutorService.submitがすべてのエラーをキャッチする可能性があります、これは根絶すべきJavaバグだと私は信じています。 –

関連する問題