我想要做的是从另一个类中创建的线程更新 UI。我已经看到了所有的建议,例如异步、处理程序、可运行等......但我在单独的类中实现它们时遇到了真正的麻烦。
一般来说,为了您的目标,我建议您使用:
我不认为它太棘手。绝对不。如果您将其作为单独的类而不是某些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();
}
}