rit*_*888 3 multithreading android asynchronous handlers runnable
我在这里看到了几个问类似问题的问题,但我还没有看到合适的答案.许多人已经询问如何从线程更新UI,但它们几乎总是与UI在同一个类中.
我要做的是从另一个类中创建的线程更新UI.我已经看到了所有的建议,比如async,handler,runnable等......但是我在单独的类中实现它们时遇到了麻烦.
我试图保持我的UI类最小化,只处理与GUI的交互,例如当用户按下按钮时.现在,我在新类中创建了一个新线程,它连接到蓝牙设备,但我想将UI线程中的一个按钮从"连接"按钮更改为"断开"按钮(即更改从创建蓝牙插座到关闭它的按钮).
这样做的一般方法是什么?我是否认为这一切都错了,应该在一堂课中拥有一切?在'main'UI类和其他类/线程之间进行交互的正确方法是什么?
理想情况下,我希望能够进行其他UI交互,因此一些允许在UI类之外进行其他UI更改的解决方案将非常棒!
我要做的是从另一个类中创建的线程更新UI.我已经看到了所有的建议,比如async,handler,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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
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();
}
}
Run Code Online (Sandbox Code Playgroud)