当你使用ViewPager来显示网络图片时,为了用户体验良好,所以你会一边下载一边更新Adapter。这个时候如果你的ADT版本是22以上的时候,你一定很纠结:我明明调用了adapter.notifyDataSetChanged,但是这货竟然还是报出 java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged!
下面我们来先看看问题:(定位问题)
在ADT22中,上面的代码肯定会报错的。为什么?看下官方文档对 support/v4/view/PagerAdapter 的一个解释:
PagerAdapter supports data set changes. Data set changes must occur on the main thread and must end with a call to notifyDataSetChanged()
similar to AdapterView adapters derived from BaseAdapter
.
出错原因:数据更新必须在main thread进行更新!!结束前还得调用 notifyDataSetChanged() !!
解决方法:
把你往集合里面添加数据的代码写到main thread 里面。
如果你使用asynctask 那么你更新集合的代码 一定不能在 doInBackground 方法里面。
如果你使用new Thread , 你的更新集合的代码一定不能在run 里面,要在Handler 里面