Retrofit 泛型解析遇到com.google.gson.internal.LinkedTreeMap cannot be cast to object
2016-06-05 23:55
956 查看
在Retrofit网络请求数据,使用泛型解析json时,出现了com.google.gson.internal.LinkedTreeMap cannot be cast to com.xylife.community.bean.Exercise的异常,折腾了好久总算解决了。
先看下异常log:
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.xylife.community.bean.Exercise
at com.xylife.community.adapter.ExerciseListAdapter.onBindViewHolder(ExerciseListAdapter.java:36)
at jp.wasabeef.recyclerview.adapters.AnimationAdapter.onBindViewHolder(AnimationAdapter.java:54)
at com.cundong.recyclerview.HeaderAndFooterRecyclerViewAdapter.onBindViewHolder(HeaderAndFooterRecyclerViewAdapter.java:258)
at android.support.v7.widget.RecyclerViewAdapter.onBindViewHolder(RecyclerView.java:5471)atandroid.support.v7.widget.RecyclerViewAdapter.onBindViewHolder(RecyclerView.java:5471)
at android.support.v7.widget.RecyclerViewAdapter.bindViewHolder(RecyclerView.java:5504)
at android.support.v7.widget.RecyclerViewRecycler.getViewForPosition(RecyclerView.java:4741)atandroid.support.v7.widget.RecyclerViewRecycler.getViewForPosition(RecyclerView.java:4741)
at android.support.v7.widget.RecyclerViewRecycler.getViewForPosition(RecyclerView.java:4617)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2906)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3283)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1077)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1695)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15718)
at android.view.ViewG
下面我们分析下。
先看json数据。
这里要感谢有心课堂的stay4it给我写的测试接口(虽然我们不熟),如果你幸运,还能打开链接:http://api.stay4it.com/test/jdsjlzx.php
这里不再讲解Retrofit和RxJava的知识,有需要请看扔物线大神的讲解:http://gank.io/post/560e15be2dca930e00da1083
Retrofit快速入门:/article/11841984.html
先看个简单的根据json数据来创建一个Response数据对象:
根据http://api.stay4it.com/test/jdsjlzx.php接口返回的json数据,我们写出如下数据对象:
HttpResponse代码
调试中就毫不留情的抛出了异常。
查找资料,找各种办法。
问题没有解决之前,还找到了篇好文章:
Java泛型让声明方法返回子类型
不经意的那么一瞬间,有个念头闪过脑海,赶紧试了下,没有想到解决了问题。
快来看看吧。
写到这里已经是深夜23:52了,当解决问题的那一刻我哭了。。。。
分享知识,希望这个思路能够帮助其他人!
至于泛型为什么非要那么写才能解决问题,我还没有理解到位,如果有高人知道请指教!
如果你是Java编程,上面的思路如果不行,请参考:http://www.ways2u.com/?post=535
先看下异常log:
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.xylife.community.bean.Exercise
at com.xylife.community.adapter.ExerciseListAdapter.onBindViewHolder(ExerciseListAdapter.java:36)
at jp.wasabeef.recyclerview.adapters.AnimationAdapter.onBindViewHolder(AnimationAdapter.java:54)
at com.cundong.recyclerview.HeaderAndFooterRecyclerViewAdapter.onBindViewHolder(HeaderAndFooterRecyclerViewAdapter.java:258)
at android.support.v7.widget.RecyclerViewAdapter.onBindViewHolder(RecyclerView.java:5471)atandroid.support.v7.widget.RecyclerViewAdapter.onBindViewHolder(RecyclerView.java:5471)
at android.support.v7.widget.RecyclerViewAdapter.bindViewHolder(RecyclerView.java:5504)
at android.support.v7.widget.RecyclerViewRecycler.getViewForPosition(RecyclerView.java:4741)atandroid.support.v7.widget.RecyclerViewRecycler.getViewForPosition(RecyclerView.java:4741)
at android.support.v7.widget.RecyclerViewRecycler.getViewForPosition(RecyclerView.java:4617)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2906)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3283)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1077)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1695)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15718)
at android.view.ViewG
下面我们分析下。
先看json数据。
{ "state": "1001", "resut": { "data": { "total": "9", "list": [ { "name": "微博", "desc": "本地相机即拍即传,随时随地分享身边新鲜事", "size": "36.58M", "icon": "http://p18.qhimg.com/t0194819784f6b3224b.png", "url": "http://shouji.360tpcdn.com/150723/de6fd89a346e304f66535b6d97907563/com.sina.weibo_2057.apk" }, { "name": "开心消消乐", "desc": "宇宙超人气三消休闲游戏“开心消消乐”", "size": "55.49M", "icon": "http://p17.qhimg.com/t01f9c104ccb2614350.png", "url": "http://shouji.360tpcdn.com/150707/2ef5e16e0b8b3135aa714ad9b56b9a3d/com.happyelements.AndroidAnimal_25.apk" } ] } } }
这里要感谢有心课堂的stay4it给我写的测试接口(虽然我们不熟),如果你幸运,还能打开链接:http://api.stay4it.com/test/jdsjlzx.php
这里不再讲解Retrofit和RxJava的知识,有需要请看扔物线大神的讲解:http://gank.io/post/560e15be2dca930e00da1083
Retrofit快速入门:/article/11841984.html
先看个简单的根据json数据来创建一个Response数据对象:
public class Response<T> { public boolean isSuccess() { return state == 1001; } public int total; public int state; public String reason; public T result; }
根据http://api.stay4it.com/test/jdsjlzx.php接口返回的json数据,我们写出如下数据对象:
public class ListResponse<T> extends HttpResponse { public ListEntity resut; public class ListEntity{ public Data data; } public class Data<T>{ public int total; public List<T> list; } }
HttpResponse代码
public class HttpResponse{ public boolean isSuccess() { return state == 1001; } public int state; }
调试中就毫不留情的抛出了异常。
查找资料,找各种办法。
问题没有解决之前,还找到了篇好文章:
Java泛型让声明方法返回子类型
不经意的那么一瞬间,有个念头闪过脑海,赶紧试了下,没有想到解决了问题。
快来看看吧。
public class ListResponse<T> extends HttpResponse { public ListEntity<T> resut; public class ListEntity<T>{ public Data<T> data; } public class Data<T>{ public int total; public List<T> list; } }
写到这里已经是深夜23:52了,当解决问题的那一刻我哭了。。。。
分享知识,希望这个思路能够帮助其他人!
至于泛型为什么非要那么写才能解决问题,我还没有理解到位,如果有高人知道请指教!
如果你是Java编程,上面的思路如果不行,请参考:http://www.ways2u.com/?post=535
相关文章推荐
- Objective-C的语法之OOP
- MVC控制器里面使用dynamic和ExpandoObject
- 多线程编程WaitForSingleObject()
- JavaAPI之AccessibleObject
- eclipse基本操作_Object类_equals()_==_hashCode()_getClass()
- Objective-C中#import如何规避多文件结构导致的重复包含;以及@class作用
- Effective Objecttive-C 2.0
- git 错误 fatal: Not a valid object name: 'master'.
- 论文笔记之:Multiple Object Recognition With Visual Attention
- [Objective-C] Copy 和 MutableCopy
- 【原】谈谈对Objective-C中代理模式的误解
- 【REACT NATIVE 系列教程之十二】REACT NATIVE(JS/ES)与IOS(OBJECT-C)交互通信
- Guava base -- MoreObjects
- Guava base -- Objects
- 第八天 java转Objective-C工具 J2ObjC
- -------------GetObject详解
- 枚举宏(Adopting Modern Objective-C)
- (java:11276): GLib-GObject-WARNING **: cannot register existing type `GdkDisplayManager'
- org.hibernate.ObjectDeletedException: deleted instance passed to merge
- objective-C 编程全解-第05章 基于引用计数的内存管理 下