このコードをテストして、uiコンポーネントをバックグラウンドスレッドから変更するとアプリがクラッシュするかどうかを確認しました。しかしそれはしませんでした。スレッドは、アクティビティライフサイクルメソッド内から開始された場合、UIを変更することができます。どうして?
ここにコードが追加されました。私はMainActivity
のonCreate()
方法で新しいスレッドを開始し、それはクラスでは
を言うandroid docsごとに墜落している必要があり、Runnable.run()メソッドが実行さ のコードが含まれています。通常、何かはRunnableで許されます。ただし、 を覚えておいてください。RunnableはUIスレッド上で実行されないため、 はViewオブジェクトなどのUIオブジェクトを直接変更できません。
私はそれがクラッシュすると予想していました。それはなかった。コードを参照してください -
public class MainActivity extends AppCompatActivity {
TextView txt;
Thread thread;
Runnable runnable = new Runnable() {
@Override
public void run() {
txt.setText("bro");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = (TextView) findViewById(R.id.name_txt);
thread = new Thread(runnable);
thread.start();
}
}
それがクラッシュをし、以下のようonClicklistener()
からスレッドを開始しながら、私はUIを変更しようとしながら。これは期待される。
public class MainActivity extends AppCompatActivity {
TextView txt;
Thread thread;
Runnable runnable = new Runnable() {
@Override
public void run() {
txt.setText("bro");
}
};
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
thread.start();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = (TextView) findViewById(R.id.name_txt);
thread = new Thread(runnable);
txt.setOnClickListener(listener);
}
}
ここで、期待されている第2のコードスニペットがクラッシュ、及び最初のものがないこと。
私は毎回新しいワーカースレッドを作成していますが、別の場所で作成しているので、なぜこのようなことが起こっているのか説明してください。公式のドキュメントの参考になるでしょう。
最初のスニペットで 'btn'とは何ですか、あなたは1つのスニペットにリンクしていて、別のものにテキストを割り当てています – OBX
このクラッシュはビューのレンダリングに先立って起こりません。最初のケースでは、ビューのプロパティ(テキスト)がビューオブジェクトに設定されていて、ビューがメインスレッドでレンダリングするのを待機しています。しかし、2番目のケースでは、ビューがレンダリングされ、setTextへの呼び出しがすぐにバックグラウンドスレッドで実行され、クラッシュする可能性があります。 – Krish
@OBXはそれを修正しました。 –