i developing android news reader apps. have asynctask implements serializable, can save instance. use handle app refresh when rotating phone. work, when rotate apps, task still running. when task running, , press home button/back button close apps, apps become force closed. there wrong code?
@override protected void onsaveinstancestate(final bundle outstate) { // super.onsaveinstancestate(outstate); outstate.putint("curpage", mpager.getcurrentitem()); outstate.putint("drawerpos", drawerpos); outstate.putserializable("task", task); if (dialog != null) { outstate.putboolean("isdialogshowing", dialog.isshowing()); } else { outstate.putboolean("isdialogshowing", false); } // outstate.putserializable("dialog", dialog); } // dismiss dialog if activity destroyed @override protected void ondestroy() { if (dialog != null && dialog.isshowing()) { dialog.dismiss(); dialog = null; } if (task.getstatus() == asynctask.status.running) task.cancel(true); task = null; super.ondestroy(); } myasynctask:
public class asynctaskrefreshrss extends asynctask<string, string, arraylist<beritaheader>> implements serializable{ /** * */ private static final long serialversionuid = 3385729493967673390l; private onresponselistener responder; // myalertdialogfragment mydialog; progressdialog dialog; fragmentmanager fm; context context; string type; string subtype; public asynctaskrefreshrss(context context, fragmentmanager fm, string type, string subtype, onresponselistener listener) { this.fm = fm; this.context = context; this.type = type; this.subtype = subtype; this.responder = listener; } public void setfinishlistener(onresponselistener listener){ this.responder = listener; } public void setdialog(progressdialog dialog) { this.dialog = dialog; } @override protected void onpreexecute() { dialog.show(); } @override protected arraylist<beritaheader> doinbackground(string... arg0) { mywebservice ws = new mywebservice(); try { return ws.getrss(type, subtype); } catch (exception e) { return null; } } public interface onresponselistener { public void onsuccess(); public void onfailure(); } @override protected void onpostexecute(arraylist<beritaheader> result) { if (dialog.isshowing()) dialog.dismiss(); if (result != null) { newsdatasource ds = new newsdatasource(context); ds.deleteallberita(type, subtype); ds.createberita(result, type, subtype); responder.onsuccess(); } else { toast toast = toast.maketext(context, "gagal memuat", toast.length_long); toast.show(); responder.onfailure(); } // asyncstate = do_nothing; } public static class myalertdialogfragment extends dialogfragment { public boolean iscanceled; public static myalertdialogfragment newinstance() { myalertdialogfragment frag = new myalertdialogfragment(); return frag; } public dialog oncreatedialog(bundle savedinstancestate) { final progressdialog dialog = new progressdialog(getactivity()); dialog.setmessage("sedang memuat"); dialog.setindeterminate(false); dialog.setcancelable(false); dialog.setoncancellistener(new oncancellistener() { @override public void oncancel(dialoginterface dialog) { // todo auto-generated method stub iscanceled = true; } }); iscanceled = false; return dialog; } } } my logcat:
07-19 19:37:00.905: e/androidruntime(29243): fatal exception: main 07-19 19:37:00.905: e/androidruntime(29243): java.lang.runtimeexception: parcelable encountered ioexception writing serializable object (name = com.karyadigital.beritaku.berita.asynctaskrefreshrss) 07-19 19:37:00.905: e/androidruntime(29243): @ android.os.parcel.writeserializable(parcel.java:1279) 07-19 19:37:00.905: e/androidruntime(29243): @ android.os.parcel.writevalue(parcel.java:1233) 07-19 19:37:00.905: e/androidruntime(29243): @ android.os.parcel.writemapinternal(parcel.java:591) 07-19 19:37:00.905: e/androidruntime(29243): @ android.os.bundle.writetoparcel(bundle.java:1619) 07-19 19:37:00.905: e/androidruntime(29243): @ android.os.parcel.writebundle(parcel.java:605) 07-19 19:37:00.905: e/androidruntime(29243): @ android.app.activitymanagerproxy.activitystopped(activitymanagernative.java:2247) 07-19 19:37:00.905: e/androidruntime(29243): @ android.app.activitythread$stopinfo.run(activitythread.java:2915) 07-19 19:37:00.905: e/androidruntime(29243): @ android.os.handler.handlecallback(handler.java:615) 07-19 19:37:00.905: e/androidruntime(29243): @ android.os.handler.dispatchmessage(handler.java:92) 07-19 19:37:00.905: e/androidruntime(29243): @ android.os.looper.loop(looper.java:137) 07-19 19:37:00.905: e/androidruntime(29243): @ android.app.activitythread.main(activitythread.java:4898) 07-19 19:37:00.905: e/androidruntime(29243): @ java.lang.reflect.method.invokenative(native method) 07-19 19:37:00.905: e/androidruntime(29243): @ java.lang.reflect.method.invoke(method.java:511) 07-19 19:37:00.905: e/androidruntime(29243): @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1008) 07-19 19:37:00.905: e/androidruntime(29243): @ com.android.internal.os.zygoteinit.main(zygoteinit.java:775) 07-19 19:37:00.905: e/androidruntime(29243): @ dalvik.system.nativestart.main(native method) 07-19 19:37:00.905: e/androidruntime(29243): caused by: java.io.notserializableexception: android.app.application 07-19 19:37:00.905: e/androidruntime(29243): @ java.io.objectoutputstream.writenewobject(objectoutputstream.java:1364) 07-19 19:37:00.905: e/androidruntime(29243): @ java.io.objectoutputstream.writeobjectinternal(objectoutputstream.java:1671) 07-19 19:37:00.905: e/androidruntime(29243): @ java.io.objectoutputstream.writeobject(objectoutputstream.java:1517) 07-19 19:37:00.905: e/androidruntime(29243): @ java.io.objectoutputstream.writeobject(objectoutputstream.java:1481) 07-19 19:37:00.905: e/androidruntime(29243): @ java.io.objectoutputstream.writefieldvalues(objectoutputstream.java:979) 07-19 19:37:00.905: e/androidruntime(29243): @ java.io.objectoutputstream.defaultwriteobject(objectoutputstream.java:368) 07-19 19:37:00.905: e/androidruntime(29243): @ java.io.objectoutputstream.writehierarchy(objectoutputstream.java:1074) 07-19 19:37:00.905: e/androidruntime(29243): @ java.io.objectoutputstream.writenewobject(objectoutputstream.java:1404) 07-19 19:37:00.905: e/androidruntime(29243): @ java.io.objectoutputstream.writeobjectinternal(objectoutputstream.java:1671) 07-19 19:37:00.905: e/androidruntime(29243): @ java.io.objectoutputstream.writeobject(objectoutputstream.java:1517) 07-19 19:37:00.905: e/androidruntime(29243): @ java.io.objectoutputstream.writeobject(objectoutputstream.java:1481) 07-19 19:37:00.905: e/androidruntime(29243): @ android.os.parcel.writeserializable(parcel.java:1274) 07-19 19:37:00.905: e/androidruntime(29243): ... 15 more
you can't make asynctask serializable , serialize it. why: can't make because system try serialize fields , on each field's fields. , if field not serializable , not marked transient you'll above exception.
if want decouple asynctask activity when activity recreated, use configuration changes fragments. here's an article describes how to.
Comments
Post a Comment