我在Activity中开了一个后台线程,负责获取数据,每个10秒通过Handler通知Activity的TextView显示(setText())。问题是当我按back键的时候,Activity会finish掉。再次启动时,依然能或得到线程发来的数据,但是却无法更新UI(setText()不更新)。如果按home键则没有问题,因为Activity不会finish掉。请高手指教啊!!!

解决方案 »

  1.   

    设置一个flag,run方法里while(flag)条件成立再执行代码块。在onDestory里让flag=false把线程关掉。不要让Activity被finish了线程还在运行。
      

  2.   

    谢谢回复,可能我没表达清楚,我需要后台线程不断的获取数据,如果关掉线程,数据就没法统计了,我不明白为什么Activity在重启后能获取到线程Handler过来的消息,却无法更新UI
      

  3.   

    这个~说说我的理解吧~你前一个activity开启的线程不断获得数据,而且会用到前一个activity中创建的handler。当你前一个acitivity关闭时,由于handler会被线程用到,所以不会被销毁。
    而你第二次开启activity时,打印的信息已经不是你当前activity中handler所打印的,而是上一个activity创建的handler。因此当前的handler是没有获得数据,及去改变ui的。
    所以建议你把获得统计数据的方法放在service里,每隔10秒发个广播,在你activity中去接收。
      

  4.   

    引起这个的原因,如果activity被finish掉了,你下次重新打开这个页面的时候,这个TextView已经是一个新的对象了,老的线程继续作用于老的那个TextView对象,老的TextView即使没有显示,因为还在被使用所有没有被回收,但是这时你这个新的TextView是不会有任何反应的。具体跑下下面的测试代码就知道了。import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.widget.TextView;public class HandlerUpdateUITest extends Activity {
    private static final String LOG_TAG = HandlerUpdateUITest.class
    .getSimpleName();
    TextView tv; Handler mHandler = new Handler() {
    public void handleMessage(android.os.Message msg) {
    tv.setText((String) msg.obj);
    Log.i(LOG_TAG, "tv.hashcode..." + tv.hashCode());
    Log.i(LOG_TAG, "tv.setText..." + (String) msg.obj);
    };
    }; @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    tv = (TextView) findViewById(R.id.text); new Thread() {
    public void run() {
    Log.i(LOG_TAG, "Thread run...");
    int i = 10;
    while (i > 0) {
    mHandler.sendMessage(Message.obtain(mHandler, 0,
    String.valueOf(this.getId()) + i));
    Log.i(LOG_TAG,
    "Thread sendMessage..."
    + (String.valueOf(this.getId()) + i));
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    } finally {
    i--;
    }
    }
    mHandler.sendMessage(Message.obtain(mHandler, 0,
    String.valueOf(this.getId()))); };
    }.start();
    }}