i new android kindly bare question id basic. tried best find solution online couldnt. trying out recyclerview concepts.
while copying array of data parcelebles array getting error stating "class not found when unmarshalling: java.lang.classnotfoundexception: invalid name:"
mainactivity code : public class mainactivity extends actionbaractivity { @injectview(r.id.idtemparaturevalue) textview mtemparaturevalue; @injectview(r.id.idhumidityvalue) textview mhumidityvalue; @injectview(r.id.idrainvalue) textview mrainvalue; @injectview(r.id.idsummaryvalue) textview msummaryvalue; @injectview(r.id.idtimevalue) textview mtimevalue; private final string tag=mainactivity.class.getsimplename(); public static final string daily_forecast="daily_forecast"; public static final string hourly_forecast="hourly_forecast"; private string apikey="******************"; private double latitude =13.0827; private double longitude =80.2707; forecast mforecast = new forecast(); private string url;/*="https://api.forecast.io/forecast/"+apikey+"/"+latitude+","+longitude;*/ @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); butterknife.inject(this); if(isnetworkavailable()){ url="https://api.forecast.io/forecast/"+apikey+"/"+latitude+","+longitude; log.i(tag,url); okhttpclient okhttpclient = new okhttpclient(); request request = new request.builder().url(url).build(); call call=okhttpclient.newcall(request); call.enqueue(new callback() { @override public void onfailure(request request, ioexception e) { } @override public void onresponse(response response) throws ioexception { try{ if(response.issuccessful()){ string jsondata=response.body().string(); log.v(tag, jsondata); log.d(tag, url); mforecast =parseforcastdata(jsondata); runonuithread(new runnable() { @override public void run() { updateuiscreen(); } }); }else{ alertuseronfailure(); } }catch(ioexception e){ log.e(tag,"caught exception : "+e); }catch(jsonexception e){ log.e(tag,"caught json exception @ onresponse(): "+e); e.printstacktrace(); } } }); }else{ alertuseronnetworkfailure(); toast.maketext(this,"network illa da koomoota !",toast.length_long).show(); } } private forecast parseforcastdata(string jsondata) throws jsonexception{ forecast mforecast=new forecast(); mforecast.setcurrent(getcurrentdetails(jsondata)); mforecast.sethours(gethourlydetails(jsondata)); mforecast.setday(getdailydetails(jsondata)); return mforecast; } private day[] getdailydetails(string jsondata) throws jsonexception { jsonobject forecast=new jsonobject(jsondata); jsonobject dailyjson=forecast.getjsonobject("daily"); string icon=dailyjson.getstring("icon"); string timezone=forecast.getstring("timezone"); jsonarray dailyjsonarray=dailyjson.getjsonarray("data"); day days[]=new day[dailyjsonarray.length()]; for(int i=0;i<dailyjsonarray.length();i++){ day day=new day(); jsonobject dailyjsondata=dailyjsonarray.getjsonobject(i); day.setsummary(dailyjsondata.getstring("summary")); day.seticon(icon); day.settime(dailyjsondata.getlong("time")); day.settimezone(timezone); day.settemparaturemax(dailyjsondata.getint("temperaturemax")); days[i]=day; } return days; } private hour[] gethourlydetails(string jsondata) throws jsonexception{ jsonobject forecast=new jsonobject(jsondata); string timezone=forecast.getstring("timezone"); jsonobject hourly=forecast.getjsonobject("hourly"); jsonarray data=hourly.getjsonarray("data"); hour[] hours=new hour[data.length()]; for(int i=0;i<data.length();i++){ hour hour=new hour(); jsonobject hourdata=data.getjsonobject(i); hour.setsummary(hourdata.getstring("summary")); hour.seticon(hourdata.getstring("icon")); hour.settime(hourdata.getlong("time")); hour.settemparature(hourdata.getdouble("temperature")); hour.settimezone(timezone); hours[i]=hour; } return hours; } private current getcurrentdetails(string jsondata) throws jsonexception{ current current = new current(); jsonobject forecast=new jsonobject(jsondata); string timezone=forecast.getstring("timezone"); current.settimezone(timezone); log.i(tag, timezone); jsonobject =forecast.getjsonobject("currently"); current.sethumidity(currently.getdouble("humidity")); current.seticon(currently.getstring("icon")); current.setpreciptationchance(currently.getdouble("precipprobability")); current.settemparature(currently.getdouble("temperature")); current.setsummary(currently.getstring("summary")); current.settime(currently.getlong("time")); return current; } private void updateuiscreen() { current current=mforecast.getcurrent(); log.i(tag, current.gettemparature() + ""); mtemparaturevalue.settext(current.getformattedtemparature()); mhumidityvalue.settext(current.gethumidity() + ""); mrainvalue.settext(current.getpreciptationchance() + ""); mtimevalue.settext("at " + current.getformattedtime() + " "); msummaryvalue.settext(current.getsummary()); } private void alertuseronnetworkfailure() { networkalertdialogfragment networkdialogfragment=new networkalertdialogfragment(); networkdialogfragment.show(getfragmentmanager(), "error_network_dialog"); } private void alertuseronfailure() { dialogfragment dialog=new dialogfragment(); dialog.show(getfragmentmanager(), "error_dialog"); } private boolean isnetworkavailable() { boolean networkstatus=false; connectivitymanager manager= (connectivitymanager) getsystemservice(context.connectivity_service); networkinfo info = manager.getactivenetworkinfo(); assert info != null; if(info!=null && info.isavailable() && info.isconnected()){ networkstatus=true; } return networkstatus; } @onclick (r.id.iddaily) public void startdailyactivity(){ intent intent=new intent(this,dailyforecastactivity.class); intent.putextra(daily_forecast,mforecast.getday()); startactivity(intent); } @onclick (r.id.idhourly) public void starthourlyactivity(){ intent intent=new intent(this,hourlyforecastactivity.class); intent.putextra(hourly_forecast,mforecast.gethours()); startactivity(intent); } recycler view adapter code :
public class hourlyforecastactivity extends actionbaractivity { hour[] mhours; @injectview(r.id.idrecylerview) recyclerview mrecyclerview; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_hourly_forecast); butterknife.inject(this); intent intent=getintent(); parcelable[] parcelables=intent.getparcelablearrayextra(mainactivity.hourly_forecast); mhours= arrays.copyof(parcelables,parcelables.length,hour[].class); hourlyadapter adapter=new hourlyadapter(mhours); mrecyclerview.setadapter(adapter); recyclerview.layoutmanager layoutmanager=new linearlayoutmanager(this); mrecyclerview.setlayoutmanager(layoutmanager); mrecyclerview.sethasfixedsize(true); } forecast class
package com.example.ragesh.myweather; /** * created ragesh on 11/6/15. */ public class forecast { private hour[] mhours; private day[] mday; private current mcurrent; public hour[] gethours() { return mhours; } public void sethours(hour[] hours) { mhours = hours; } public day[] getday() { return mday; } public void setday(day[] day) { mday = day; } public current getcurrent() { return mcurrent; } public void setcurrent(current current) { mcurrent = current; } public static int geticonid(){ return r.mipmap.partly_cloudy; } } hour class
package com.example.ragesh.myweather; import android.os.parcel; import android.os.parcelable; import java.text.simpledateformat; import java.util.date; /** * created ragesh on 11/6/15. */ public class hour implements parcelable{ private long mtime; private string msummary; private double mtemparature; private string micon; private string mtimezone; public hour(parcel in) { msummary=in.readstring(); mtime=in.readlong(); mtemparature=in.readdouble(); micon=in.readstring(); } public hour() { } public string gethour(){ simpledateformat format=new simpledateformat("h a"); date date=new date(mtime*1000); return format.format(date); } public string gettimezone() { return mtimezone; } public void settimezone(string timezone) { mtimezone = timezone; } public long gettime() { return mtime; } public void settime(long time) { mtime = time; } public string getsummary() { return msummary; } public void setsummary(string summary) { msummary = summary; } public int gettemparature() { return (int) math.round(mtemparature); } public void settemparature(double temparature) { mtemparature = temparature; } public string geticon() { return micon; } public void seticon(string icon) { micon = icon; } @override public int describecontents() { return 0; } @override public void writetoparcel(parcel dest, int flags) { dest.writestring(msummary); dest.writedouble(mtemparature); dest.writestring(micon); dest.writelong(mtime); } public static final creator<hour> creator=new creator<hour>() { @override public hour createfromparcel(parcel source) { return new hour(source); } @override public hour[] newarray(int size) { return new hour[size]; } }; } logs :
07-15 14:59:20.708 2554-2572/com.example.ragesh.myweather i/mainactivity﹕ asia/kolkata 07-15 14:59:20.770 2554-2554/com.example.ragesh.myweather i/mainactivity﹕ 85.0 07-15 14:59:23.777 2554-2562/com.example.ragesh.myweather w/art﹕ suspending threads took: 8.576ms 07-15 14:59:23.834 2554-2554/com.example.ragesh.myweather e/parcel﹕ class not found when unmarshalling: java.lang.classnotfoundexception: invalid name: @ java.lang.class.classforname(native method) @ java.lang.class.forname(class.java:309) @ android.os.parcel.readparcelablecreator(parcel.java:2281) @ android.os.parcel.readparcelable(parcel.java:2245) @ android.os.parcel.readparcelablearray(parcel.java:2338) @ android.os.parcel.readvalue(parcel.java:2206) @ android.os.parcel.readarraymapinternal(parcel.java:2485) @ android.os.basebundle.unparcel(basebundle.java:221) @ android.os.bundle.getparcelablearray(bundle.java:777) @ android.content.intent.getparcelablearrayextra(intent.java:5112) @ com.example.ragesh.myweather.hourlyforecastactivity.oncreate(hourlyforecastactivity.java:32) @ android.app.activity.performcreate(activity.java:6010) @ android.app.instrumentation.callactivityoncreate(instrumentation.java:1129) @ android.app.activitythread.performlaunchactivity(activitythread.java:2292) @ android.app.activitythread.handlelaunchactivity(activitythread.java:2413) @ android.app.activitythread.access$800(activitythread.java:155) @ android.app.activitythread$h.handlemessage(activitythread.java:1317) @ android.os.handler.dispatchmessage(handler.java:102) @ android.os.looper.loop(looper.java:135) @ android.app.activitythread.main(activitythread.java:5343) @ java.lang.reflect.method.invoke(native method) @ java.lang.reflect.method.invoke(method.java:372) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:905) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:700) 07-15 14:59:23.835 2554-2554/com.example.ragesh.myweather d/androidruntime﹕ shutting down vm 07-15 14:59:23.836 2554-2554/com.example.ragesh.myweather e/androidruntime﹕ fatal exception: main process: com.example.ragesh.myweather, pid: 2554 java.lang.runtimeexception: unable start activity componentinfo{com.example.ragesh.myweather/com.example.ragesh.myweather.hourlyforecastactivity}: android.os.badparcelableexception: classnotfoundexception when unmarshalling: @ android.app.activitythread.performlaunchactivity(activitythread.java:2339) @ android.app.activitythread.handlelaunchactivity(activitythread.java:2413) @ android.app.activitythread.access$800(activitythread.java:155) @ android.app.activitythread$h.handlemessage(activitythread.java:1317) @ android.os.handler.dispatchmessage(handler.java:102) @ android.os.looper.loop(looper.java:135) @ android.app.activitythread.main(activitythread.java:5343) @ java.lang.reflect.method.invoke(native method) @ java.lang.reflect.method.invoke(method.java:372) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:905) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:700) caused by: android.os.badparcelableexception: classnotfoundexception when unmarshalling: @ android.os.parcel.readparcelablecreator(parcel.java:2295) @ android.os.parcel.readparcelable(parcel.java:2245) @ android.os.parcel.readparcelablearray(parcel.java:2338) @ android.os.parcel.readvalue(parcel.java:2206) @ android.os.parcel.readarraymapinternal(parcel.java:2485) @ android.os.basebundle.unparcel(basebundle.java:221) @ android.os.bundle.getparcelablearray(bundle.java:777) @ android.content.intent.getparcelablearrayextra(intent.java:5112) @ com.example.ragesh.myweather.hourlyforecastactivity.oncreate(hourlyforecastactivity.java:32) @ android.app.activity.performcreate(activity.java:6010) @ android.app.instrumentation.callactivityoncreate(instrumentation.java:1129) @ android.app.activitythread.performlaunchactivity(activitythread.java:2292) at android.app.activitythread.handlelaunchactivity(activitythread.java:2413) at android.app.activitythread.access$800(activitythread.java:155) at android.app.activitythread$h.handlemessage(activitythread.java:1317) at android.os.handler.dispatchmessage(handler.java:102) at android.os.looper.loop(looper.java:135) at android.app.activitythread.main(activitythread.java:5343) at java.lang.reflect.method.invoke(native method) at java.lang.reflect.method.invoke(method.java:372) at com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:905) at com.android.internal.os.zygoteinit.main(zygoteinit.java:700)
reading , writing must in same order or parcelable class fail. reading , writing not in same order:
public hour(parcel in) { msummary=in.readstring(); mtime=in.readlong(); mtemparature=in.readdouble(); micon=in.readstring(); } @override public void writetoparcel(parcel dest, int flags) { dest.writestring(msummary); dest.writedouble(mtemparature); dest.writestring(micon); dest.writelong(mtime); } fix class using parcelabler here: http://www.parcelabler.com/
Comments
Post a Comment