我想在一个应用里实时刷新获取的数据,所以我拿了一个for循环来做实验,下面是我的代码
private int number=1;
    private Thread mthread;
    private Handler handler=new Handler()
    {
     public void handleMessage(Message msg)
     {
     switch (msg.what) {
case MESSAGE_SUCCESS:
cntv.setText("异步刷新成功"+number);
break;
default:
break;
}
     }
    };
    
Runnable runnable=new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
number++;
handler.obtainMessage(MESSAGE_SUCCESS).sendToTarget();
}
};protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

cntv=(TextView)findViewById(id.ContactName_tv);
mbutton1=(Button)findViewById(id.button1);
mbutton1.setOnClickListener(new Button.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
for (int i = 0; i < 20; i++) {
mthread=new Thread(runnable);
mthread.start();
}
}
});
}
但是为什么总是等到循环结束后才显示获得的最后一个值呢?
有没有什么办法可以每循环一次就更改一次View显示的值呢?Android界面asynchronous

解决方案 »

  1.   

    因为你在主线程做的循环 把for循环写到runnable中 就不会这样了 最好sleep下 效果更明显
      

  2.   

    你的代码相当于在主线程开启了20个子线程。子线程共享一个number数据。每个线程都会对这个数据进行操作。
    如果你的应用里是多个子线程要操作同一个数据并返回结果到textview上,你的这种方法是没有错的。只不过因为cpu处理的很快,20个子线程几乎同时对textview刷新,显示的是最后一个。如果你的应用想要达到某一个子线程对数据进行实时操作,并把结果返回到textview上,请参考楼上的做法。
      

  3.   

    谢谢楼上2位,已经完美解决了,但是还有个问题,就是关于thread的终止问题,是执行完毕之后thread就被释放掉了?还是需要等待GC来回收?
      

  4.   

    貌似思路有点迷糊,你的for循环是用来模拟下载,那你的for是耗时操作,那你的耗时操作应该放在线程里头
      

  5.   

    thread执行完之后,thread的生命周期就dead了。这方面你可以去查查thread的生命周期。
    一个thread dead以后。它占用的资源被释放掉,但是至于是否会被GC回收,这个不太清楚,应该是不会吧,这好像跟线程池有关,这方面不太清楚。网上有一篇文章说是 dead !=回收 。没经过试验不敢乱下结论,lz你可以去试试。