android - Circle Progress Bar on Fragment is not showing progress -
i'm trying show feedback percentage of have downloaded data server.
the flow goes this:
loginactivity - onsuccess, call service download data - while service working, i've switched user homeactivity
homeactivity -this activities layout holds fragment created called loadingfragment -there method in loadingfragment subscribed event posted service
my problem fragment ui not changing @ whenever event has been posted.
i logged everything, , can see event posting correct data data not being reflected on ui.
below service:
@override public int onstartcommand(intent intent, int flags, final int startid) { integer id = intent.getintextra("id", 0); //do sync here log.i(log_tag, "make rest call retrieve r id: " + id); mrestclient.getapiservice().getr(id, new callback<list<r>>() { @override public void success(list<r> rresponse, response response) { integer outstanding = routeresponse.size(); integer percentage; loadingevent loadingevent = new loadingevent(); syncevent syncevent = new syncevent(); log.i(log_tag, "callback success r"); system.out.println("yohellotest"); log.i(log_tag, "begin insertion"); daomaster daomaster = myapp.getdaomaster(); daosession session = daomaster.newsession(); sqlitedatabase db = session.getdatabase(); rdao rdao = session.getrdao(); wdao wdao = session.getwdao(); jdao jdao = session.getjdao(); log.i(log_tag, "--beginning transaction--"); //db.begintransaction(); try { int counter = 0; for(int = 0; < rresponse.size(); i++) { r r = rresponse.get(i); rdao.insert(r); log.i(log_tag, "inserted r: " + r.getid()); for(int j = 0; j < r.getw().size(); j++) { w w = r.getw().get(j); wdao.insert(w); log.i(log_tag, "inserted w: " + w.getid()); for(int k = 0; k < w.getj().size(); k++) { j j = w.getj().get(k); jdao.insert(j); log.i(log_tag, "inserted j: " + j.getjid()); } } counter += 1; percentage = (int) math.floor((double) counter / outstanding * 100); loadingevent.setpercentage(percentage); bus.post(loadingevent); } log.i(log_tag, "finished inserting"); //db.settransactionsuccessful(); } catch (exception e) { log.i(log_tag, "exception happened " + e.getmessage().tostring()); system.out.println("yo happened, don't know what"); } { log.i(log_tag, "--closing transaction--"); //db.endtransaction(); } syncevent.setissuccess(true); syncevent.setstatus(200); bus.post(syncevent); } @override public void failure(retrofiterror error) { log.i(log_tag, "rest call failed api"); system.out.println("failtests"); } }); return start_sticky; } fragment subscribed method
@subscribe public void loadingresponse(final loadingevent loadingevent) { log.i(log_tag, "response loading: " + loadingevent.getpercentage()); if(getactivity() == null) return; texttest.settext(loadingevent.getpercentage().tostring()); getactivity().runonuithread(new runnable() { @override public void run() { log.i(log_tag, "updating ui loading text" + loadingevent.getpercentage().tostring()); mcircularprogressbar.setprogress(loadingevent.getpercentage()); texttest.settext(loadingevent.getpercentage().tostring()); } }); } when check logs, see coming in fine, ui not reflecting it. missing here?
edit forgot mention. i'm using library circle progress bar:
edit
as of today, still have yet figure out. noticed adapter not being updated when service posts event. previously, context used startservice() getapplicationcontext() loginactivity. thought might have been problem changed instance of homeactivity instead. thought firing service homeactivity have solved problem, i'm still getting same results unfortunately.
okay no 1 tried attempt answering question figured out.
i skimped on documentation part of service class , didn't know executing on main thread. fix this, had run asynctask execute operation in background.
the thing had change in codebase move executing code onstartcommand method asynctask. asynctask initiated onstartcommand , should working fine.
my code looks :
service
@override public int onstartcommand(intent intent, int flags, int startid) { downloadtask downloadtask = new downloadtask(); downloadtask.execute(); return start_sticky; } private class downloadtask extends asynctask<void, void, loginevent> { @override protected loginevent doinbackground(void... params) { //code here run operations //call api, insert db, post events etc... // } @override protected void onpostexecute(loginevent event) { //run here want after execution } } you can ignore loginevent event bus post events subscribers.
also, keep in mind if going change views asynctask through bus, make sure subscriber uses runonui execute or else you'll hit runtime exception since you're trying change view other mainthread.
Comments
Post a Comment