0

我正在尝试将我的 Main 活动传递给具有正在运行的线程的 java 类。当线程被调用时,我必须在我的活动类中引用一些对象,这些对象做一些工作并更新 UI。我的代码看起来像这样。

/**
 *
 */
public class MainActivity extends Activity {

     Person person;

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);

          person = new Person();
     }


     public void updateInfo(String action) {

          person.setAction(action);

          //redraw the person to the gui
          ImageView image = (ImageView) findViewById(R.id.action);
          int id = getResources().getIdentifier(person.getCurrentAction(),"drawable", getPackageName());
          image.setImageResource(id);


     }
 }

 /**
  *
  */
 public class ThreadClass {

     private MainActivity mainActivity;

     public SocketClient(MainActivity mainActivity) {
           this.mainActivity = mainActivity;
           new MyThread().start();
     }

     private class MyThread extends Thread {

          public void run() {
              try {
                  while(!isInterrupted() {
                      mainActivity.updateInfo("Person is running");
                  }
              }
          }

     }


 }

当我这样做时,我会收到错误消息,即我没有在正确的线程中更新视图。android.View.ViewRoot$CalledFromWrongThreadException。我在这里做错了什么?此外,这段代码很可能不会编译它的伪代码,因为我必须去掉所有其他逻辑。

4

1 回答 1

1

如果我理解这个问题,我建议你从不同的角度工作。

你永远不应该通过你的活动课。活动类是控制器,是所发生事情的主人。

所以你将对象和数据传递给你的后台线程。当 Main UI 被调用时,UI 会从线程中询问这些对象并更新他的 UI。

如果您希望这在常规基础上发生,您应该在线程中实现一个监听器,这样主线程可以在更新它的数据时得到通知。

最后一种方法是使用良好的旧观察者模式,但我并不热衷于使用那个。

编辑:看看 AsyncTask:AsyncTask Android 示例

于 2012-07-23T13:46:47.100 回答