从另一个类的线程更新Android UI

rit*_*888 3 multithreading android asynchronous handlers runnable

我在这里看到了几个问类似问题的问题,但我还没有看到合适的答案.许多人已经询问如何从线程更新UI,但它们几乎总是与UI在同一个类中.

我要做的是从另一个类中创建的线程更新UI.我已经看到了所有的建议,比如async,handler,runnable等......但是我在单独的类中实现它们时遇到了麻烦.

我试图保持我的UI类最小化,只处理与GUI的交互,例如当用户按下按钮时.现在,我在新类中创建了一个新线程,它连接到蓝牙设备,但我想将UI线程中的一个按钮从"连接"按钮更改为"断开"按钮(即更改从创建蓝牙插座到关闭它的按钮).

这样做的一般方法是什么?我是否认为这一切都错了,应该在一堂课中拥有一切?在'main'UI类和其他类/线程之间进行交互的正确方法是什么?

理想情况下,我希望能够进行其他UI交互,因此一些允许在UI类之外进行其他UI更改的解决方案将非常棒!

Sim*_*iak 8

我要做的是从另一个类中创建的线程更新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)