MyException - 我的异常网
当前位置:我的异常网» Android » 线程异步从网下取数据刷新列表的有关问题

线程异步从网下取数据刷新列表的有关问题

www.MyException.Cn  网友分享于:2013-02-20  浏览:10次
线程异步从网上取数据刷新列表的问题
界面就是一个列表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掉,所以十分头疼...求能解决应对用户这种“刷新->取消->刷新->取消”操作的方法

------解决方案--------------------
引用:
如果用户取消了,这一条线程还在阻塞着呢?例如在等待服务端响应蛋,或是正在下载数据但网速比较慢甚至网速几乎接近于0呢。这种情况下很多人都会停止当前链接并进行刷新的吧?难道点击了刷新以后要等到上一条数据链接失败或者下载完数据再去开启新的线程下载新数据吗?那这样跟不刷新有什么区别?
 ……


我也碰到过这种问题,我是这么解决的,取消时直接断开网络链接,这个时候阻塞的网络线程马上会返回连接出错,然后重新启动网络链接,再次连接
------解决方案--------------------
觉得应该这样,当用户点击刷新按钮时,在主线程中调用drop函数,drop函数中还需要添加断开网络连接的代码。然后在子线程中捕获网络异常并判断isDrop标志位,再然后子线程通过handler通知主线程子线程已经跑完结束,最后主线程中再次new新的子线程,重新联网获取数据。
这样就能确保,在一个子线程跑完之前不会有新的子线程出现,从而解决问题。

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有