Android:将Activity传递给java类,运行线程错误视图异常

时间:2012-07-23 13:39:45

标签: android

我正在尝试将我的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。我在这做错了什么?此代码也很可能不会编译其伪代码,因为我必须取出所有其他逻辑。

1 个答案:

答案 0 :(得分:1)

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

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

因此,您将对象和数据传递给后台线程。当调用主UI时,UI将从线程中回询这些对象并更新其UI。

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

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

编辑:看看AsyncTask:AsyncTask Android example