界面就是一个列表ListView加一个刷新按钮Button
流程:
1.点击刷新时,新建线程从网络取回数据,更新ListView,线程取数据时时会有ProgressDialog提示“正在读取”
2.线程跑完,关掉ProgressDialog,用读取到的数据不为空则更新ListView
3.如果读取中途关掉ProgressDialog,则线程内标示符置false,抛弃改线程线程代码大致如下private class LoadListRunnable implements Runnable {
private boolean isDrop;

public void drop() {
isDrop = true;
} @Override
public void run() {
{ ...... } //http从网络读取数据,阻塞等待回应 if(!isDrop) {
mHandler.sendMessage(SUCCESS);
}

}每次点击刷新都把现有的LoadListRunnable给drop掉,重新new一个LoadListRunnable来去数据old_LoadListRunnable.drop();
old_LoadListRunnable = new LoadListRunnable();
newThread(old_LoadListRunnable).start(); //也有用线程池的
现在的问题是,不停的进行“刷新->取消->刷新->取消”操作的话,drop掉线程会阻塞在等待网络返回数据的状态,甚至有些线程一直在wait状态,这就导致了线程的大量堆积,十分的占用资源。java线程不能直接kill掉,所以十分头疼...求能解决应对用户这种“刷新->取消->刷新->取消”操作的方法

解决方案 »

  1.   

    额,我都是有的AsyncTask来做的
      

  2.   


    更新列表是一种可能会反复执行的操作,所以用AsynTask做是不合适的,而且如果在重复操作的情况下还不如thread+runnable或线程池好控制
      

  3.   

    觉得应该这样,当用户点击刷新按钮时,在主线程中调用drop函数,drop函数中还需要添加断开网络连接的代码。然后在子线程中捕获网络异常并判断isDrop标志位,再然后子线程通过handler通知主线程子线程已经跑完结束,最后主线程中再次new新的子线程,重新联网获取数据。
    这样就能确保,在一个子线程跑完之前不会有新的子线程出现,从而解决问题。