私がやろうとしているのは、別のクラスで作成されたスレッドから UI を更新することです。async、handlers、runnable などのすべての提案を見てきましたが、それらを別々のクラスに実装するのに本当に苦労しています。
一般的に、あなたの目標のために私はあなたが使用することをお勧めします:
あまりにもトリッキーだとは思いません。絶対違う。一部のクラスの内部クラスとしてではなく、分離されたクラスとして持っている場合はActivity
、コンテキスト、ウィジェット、一般的に必要なものを渡すコンストラクターを使用し、正しいメソッドで使用することをお勧めします(UI の更新を可能にします)。を更新しますUI
。
私はきれいなクラスがあるときが好きなので(UIクラスにはUI実装のみがあり、ロジックは個別に配置されています)、そうしています。
例:
public class TaskExample extends AsyncTask<Void, Integer, Void> {
private Context c;
private Button b;
public TaskExample(Context c, Button b) {
this.c = c;
this.b = b;
}
protected Void doInBackground(Void... params) {
// some work
if (isSomethingConnected) {
publishProgress(Constants.IS_CONNECTED);
}
return null;
}
public void onProgressUpdate(Integer... params) {
switch (params[0]) {
case Constants.IS_CONNECTED:
b.setText("Connected");
break;
case Constants.ANOTHER_CONSTANT:
// another work
break;
}
}
}
使用法:
public class Main extends Activity implements View.OnClickListener {
private Button b;
public void onCreate(Bundle b) {
super.onCreate(b);
// initialise widgets and set listeners to appropriate widgets
}
public void onClick(View v) {
switch(v.getId()) {
case R.id.connectBtn:
startWorker();
break;
}
}
private void startWorker() {
TaskExample te = new TaskExample(this, b);
te.execute();
}
}