android - onPostExecute is not called in AsyncTask<Void, Void, Boolean> with abstract class -
i working google calendar api , stuck asynctask. onpostexecute cannot called if use abstract class.
makerequesttask.java
import android.app.progressdialog; import android.os.asynctask; import android.util.log; import com.google.api.client.googleapis.extensions.android.gms.auth.googleplayservicesavailabilityioexception; import com.google.api.client.googleapis.extensions.android.gms.auth.userrecoverableauthioexception; import java.io.ioexception; import java.util.list; abstract class makerequesttask extends asynctask<void, void, boolean> { private string tag = "makerequesttask"; final mainactivity mainactivity; final com.google.api.services.calendar.calendar mservice; private exception mlasterror = null; progressdialog loading = null; //calendar service; makerequesttask(mainactivity mainactivity) { this.mainactivity = mainactivity; this.mservice = mainactivity.mservice; loading = new progressdialog(mainactivity); loading.setcancelable(true); loading.setmessage("sync google calendar"; loading.setprogressstyle(progressdialog.style_spinner); } @override protected void onpreexecute() { super.onpreexecute(); log.i(tag, "onpreexecute"); mainactivity.numasynctasks++; loading.show(); } @override protected final boolean doinbackground(void... ignored) { log.i(tag, "doinbackground"); try { doinbackground(); return true; } catch (final googleplayservicesavailabilityioexception availabilityexception) { mainactivity.showgoogleplayservicesavailabilityerrordialog( availabilityexception.getconnectionstatuscode()); } catch (userrecoverableauthioexception userrecoverableexception) { mainactivity.startactivityforresult( userrecoverableexception.getintent(), mainactivity.request_authorization); } catch (ioexception e) { //utils.logandshow(activity, mainactivity.tag, e); log.i(tag, "ioexception" + e); } return false; } @override protected final void onpostexecute(boolean success) { super.onpostexecute(success); log.i(tag, "onpostexecute"); loading.cancel(); if (0 == --mainactivity.numasynctasks) { } if (success) { } } abstract protected void doinbackground() throws ioexception; } asyncloadevent.java (one of abstract class)
import android.content.sharedpreferences; import android.preference.preferencemanager; import android.util.log; import com.google.api.client.util.datetime; import com.google.api.services.calendar.model.event; import com.google.api.services.calendar.model.events; import java.io.ioexception; import java.util.arraylist; import java.util.list; class asyncloadevent extends makerequesttask { private string tag = "asyncloadevent"; asyncloadevent(mainactivity mainactivity) { super(mainactivity); this.mainactivity = mainactivity; } @override protected void doinbackground() throws ioexception { log.i(tag, "doinbackground"); try { ...... } catch (exception e) { log.i(tag, "exception" + e); cancel(true); } } } as can see question, if not use abstract class , change asynctask java follows, onpostexecute called.
... @override protected final boolean doinbackground(void... ignored) { log.i(tag, "doinbackground"); return true; } ... i appreciate if point out mistake in code, duplicate solution nice, long providing clear explanation or guide.
if want more code in abstract class, so.
ok, have found issue after work around. related abstract class.
asyncloadevent.java (one of abstract class)
@override protected void doinbackground() throws ioexception { log.i(tag, "doinbackground"); try { getdatafromapi(); } catch (exception e) { log.i(tag, "exception : " + e); cancel(true); log.i(tag, "cancel(true)"); } } the class jumped exception , run "cancel(true)" because tried update ui components in "getdatafromapi()", , wouldn't call onpostexecute().
i seeked override method in asynctask class , found oncancelled() available. , saw thread says:
calling method result in oncancelled(object) being invoked on ui thread after doinbackground(object[]) returns. calling method guarantees onpostexecute(object) never invoked. after invoking method, should check value returned iscancelled() periodically doinbackground(object[]) finish task possible.
Comments
Post a Comment