我在这里看到了一些提出类似问题的问题,但我还没有看到合适的答案。许多人询问如何从线程更新 UI,但它们几乎总是与 UI 位于同一类中。
我想做的是从另一个类中创建的线程更新 UI。我已经看到了所有的建议,例如异步、处理程序、可运行等......但我在单独的类中实现它们时遇到了真正的麻烦。
我试图使我的 UI 类保持最小,并且只处理与 GUI 的交互,例如当用户按下按钮时。现在,我在一个新类中创建了一个新线程,该线程连接到蓝牙设备,但随后我想将 UI 线程中的按钮从“连接”按钮更改为“断开连接”按钮(即更改从创建蓝牙套接字到关闭它的按钮)。
执行此操作的一般方法是什么?我是否认为这一切都是错误的,应该将所有内容都放在一堂课中? “主”UI 类和其他类/线程之间交互的正确方法是什么?
理想情况下,我希望能够进行其他 UI 交互,因此允许在 UI 类之外进行其他 UI 更改的解决方案会很棒!
我想做的是从一个线程更新 UI
在另一个类中创建。我已经看到了所有的建议,例如
异步、处理程序、可运行等等...但我遇到了真正的麻烦
在不同的类中实现它们。
一般来说,为了您的目标,我建议您使用:
- AsyncTask http://developer.android.com/reference/android/os/AsyncTask.html
-
IntentService http://developer.android.com/reference/android/app/IntentService.html with ResultReceiver http://developer.android.com/reference/android/os/ResultReceiver.html
我不认为这太棘手。绝对不。如果您将其作为单独的类而不是某些中的内部类Activity
类,所以我建议使用构造函数,您将在其中传递上下文、小部件,通常是您想要的任何内容,然后以正确的方法(允许 UI 更新)更新您的UI
.
我这样做是因为我喜欢拥有干净的类(因此 UI 类只有 UI 实现并且逻辑单独定位)。
Example:
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;
}
}
}
Usage:
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();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)