次のコードでは非常に多くの問題がありますが、エラーは表示されず、表示されます。NullPointerExceptionがスローされない
- btn3.setText( "fud"); NullPointerExceptionをスローする必要があります。それはしません。
- 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();
}
}
編集:私は悪い答えを取得していますので、私は私自身の質問に答えてみましょう。
- ExecutorService.submitは、Runnableをtry/catchでラップします。エラーがスローされた場合は、静かに破棄されます。これはAndroidチームのひどいデザインです... gezzz
- 明らかに、別のスレッドからいくつかのビューコンポーネントを変更することができます。ちょうどそれらのすべてではありません。
これはうまく動作しますか?それはあなたに叫んでいませんか? btn2のテキストは実際に変更されますか? –
1.これはおそらく、あなたがスレッドでそれをやっており、メインのUIスレッドがまだ生きているからです(おそらくAndroidに設計されているので、UIは他のスレッドに邪魔されません)。 – Drejc