android - Proper notification of AsyncTaskLoader about data changes from background thread -
i want implement asynctaskloader
custom data source:
public class datasource { public interface datasourceobserver { void ondatachanged(); } ... }
datasource
keep list of registered observers , notify them changes. customloader
implement datasourceobserver
. question how notify customloader
since loader.oncontentchanged()
must called ui thread in case datasource
operations (and calls datasourceobserver.ondatachanged()
) done background threads.
updated idea selvin tip:
public class customloader extends asynctaskloader<...> implements datasource.datasourceobserver { private final handler observerhandler; public customloader(context context) { super(context); observerhandler = new handler() } @override public void ondatachanged() { observerhandler.post(new runnable() { @override public void run() { oncontentchanged(); } }); } }
i've had lot of success using local broadcasts in case that's similar yours. method involves asynctaskloader
implementation register broadcastreceiver
listening particular string describes what's changed. broadcastreceiver
keeps reference loader
, calls oncontentchanged
. when data needs refresh, make local broadcast aforementioned string , broadcastreceiver
hear , trigger load. here's example code, may not work if drop in, i've generalized class names, you'll idea:
broadcast receiver used in loader implmentation:
public class loaderbroadcastreceiver extends broadcastreceiver { private loader loader; public loaderbroadcastreceiver(loader loader) { this.loader = loader; } @override public void onreceive(context context, intent intent) { loader.oncontentchanged(); } }
loader implementation registers receiver in onstartloading()
private loaderbroadcastreceiver loaderbroadcastreceiver = null; @override protected void onstartloading() { //... code here if(loaderbroadcastreceiver == null) { loaderbroadcastreceiver = new loaderbroadcastreceiver(this); localbroadcastmanager.getinstance(getcontext()).registerreceiver(loaderbroadcastreceiver, new intentfilter("newdatastring")); } //... more code here }
finally, here's how ondatachanged in datasource make broadcast. it'll need context send broadcast. since can called arbitrary thread, i'd use applicationcontext, since context activity cause problems if activity destroyed.
public class datasource { public interface datasourceobserver { void ondatachanged(context applicationcontext) { localbroadcastmanager.getinstance(context).sendbroadcast(new intent("newdatastring")); } } ... }
you'll want play bit see how works you. can use different strings differentiate different data needs loading. you'll want unregister receiver @ point, perhaps in onreset()
. let me know if of in unclear in comments, i'll try best clarify.
Comments
Post a Comment