我正在尝试将我的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。我在这做错了什么?此代码也很可能不会编译其伪代码,因为我必须取出所有其他逻辑。
答案 0 :(得分:1)
如果我理解这个问题,我建议你从不同的角度工作。
你永远不应该通过你的活动课程。活动类是控制器,是发生的事情的主人。
因此,您将对象和数据传递给后台线程。当调用主UI时,UI将从线程中回询这些对象并更新其UI。
如果你想在常规基础上发生这种情况,你应该在你的线程中实现一个监听器,这样主线程可以在何时更新它的数据时得到通知。
最后一种方法是使用好的旧观察者模式,但我不想热衷于使用那种模式。
编辑:看看AsyncTask:AsyncTask Android example