今天在做那个缓存处理的时候,爆出了以下异常:
在使用ViewPager时报出The application’s PagerAdapter changed the adapter’s contents without calling PagerAdapter#notifyDataSetChanged
于是我们肯定会调用adapter.notifyDataSetChanged,但是会发现,还是报出了 java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged!
当你使用ViewPager来显示网络的图片时,为了用户体验,你肯定一边下载一边更新Adapter。需要注意的是如果这个时候你的ADT版本是22以上的时候,你一定会很纠结:我明明调用了adapter.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()!!!
解决办法:
1)将你往集合里面添加数据的代码写到main thread(主线程)里面。
2)如果你使用的asynctask 那么你更新集合的代码一定不能再doInBackground方法里面。
3)如果你使用new Thread,你的更新集合的代码一定不能再run里面,要在Handler里面。