问题描述:要做这么一个功能,从网上获取一些数据,数据内容未获取到前显示一张图片(等待图片,但不是progressbar),一旦数据获取成功就通知主UI,使其为listView
这两天都在搞这个问题,用尽线程无数,始终无法解决诸如线程安全和4.0网络线程问题。
最开始,我将网络线程与UI主线程放在一起,可总是报android.os.NetworkOnMainThreadException 错误,更别提更新UI了!貌似这是因为android高版本为了优化类似主UI进程长时间等待所做的改变。在8以下的版本中都没有这样的问题。
后来,我将网络线程独立出来。启用一个网络线程用于控制网络数据获取和获取成功后的UI更新。可是问题又来了:新启动的网络线程中根本无法操作主线程里的UI。连context都传不进来。会报类似这样的错误android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.
终于,为了解决这些问题,我最终还是回归了android系统中的handler。使用handler来解决这个问题就简单多了。
步骤:
1.开始onCreate中设置等待UI
2.启动网络连接获取数据线程,此线程中将获得的数据赋值给主类全局数据参数,判断是否获取数据成功,成功则通知ui更新(向主UI线程的handler对象send一个msg)
3.在主UI线程中监视handler的msg,若发现msg被更改为预设情况,则更新ui
奉上代码: