android - AsyncTask and Looper.prepare() error -


i have following code

class overlaytask extends asynctask<void, void, void> {     @override     public void onpreexecute() {          if (sites != null) {             mymapview.getoverlays().remove(sites);             mymapview.invalidate();             sites = null;         }     }      @override     public void doinbackground(void... unused) {             grabshipswithlocation();             return (null);     }      @override     public void onpostexecute(void unused) {         mymapview.getoverlays().add(sites);         mymapview.invalidate();         isloading = false;     } } 

that seems work fine on few test devices seeing lot of errors appearing on dev console. can't seem work out why , put looper.prepare(). needed?

java.lang.exceptionininitializererror @ com.test.appname.findermain$1.gotlocation(findermain.java:286) @ com.test.appname.mylocation$getlastlocation.run(mylocation.java:89) @ java.util.timer$timerimpl.run(timer.java:289) caused by: java.lang.runtimeexception: can't create handler inside thread has not called looper.prepare() @ android.os.handler.<init>(handler.java:121) @ android.os.asynctask$internalhandler.<init>(asynctask.java:421) @ android.os.asynctask$internalhandler.<init>(asynctask.java:421) @ android.os.asynctask.<clinit>(asynctask.java:152) 

as requested mylocation.java

    class getlastlocation extends timertask {     @override     public void run() {          lm.removeupdates(locationlistenergps);          lm.removeupdates(locationlistenernetwork);           location net_loc=null, gps_loc=null;          if(gps_enabled)              gps_loc=lm.getlastknownlocation(locationmanager.network_provider);          if(network_enabled)              net_loc=lm.getlastknownlocation(locationmanager.gps_provider);           //if there both values use latest 1          if(gps_loc!=null && net_loc!=null){              if(gps_loc.gettime()>net_loc.gettime())                  locationresult.gotlocation(gps_loc);              else                  locationresult.gotlocation(net_loc);              return;          }           if(gps_loc!=null){              locationresult.gotlocation(gps_loc); //line 89              return;          }          if(net_loc!=null){              locationresult.gotlocation(net_loc);              return;          }          locationresult.gotlocation(null);     } } 

long story:

asynctask internally uses handler. handler allows post runnables thread on thread handler assigned to, in case of asynctask thread called. works threads have looper prepared, though.

for more information see http://developer.android.com/reference/android/os/handler.html

short story:

simply wrap every call findermain$1.gotlocation or creation of asynctask within in runnable, , post handler bound ui thread, this:

class getlastlocation extends timertask {     private handler mhandler = new handler(looper.getmainlooper());      @override     public void run() {        // ...        mhandler.post(new runnable() {           public void run() {               locationresult.gotlocation(null);           }        });        // ...      } } 

Comments

Popular posts from this blog

android - Spacing between the stars of a rating bar? -

html - Instapaper-like algorithm -

c# - How to execute a particular part of code asynchronously in a class -