Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AsyncTask and Looper.prepare() error

I have the 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 to work fine on a few test devices but I am seeing a lot of errors appearing on the dev console. I can't seem to work out why and where to put this Looper.prepare(). Is it needed?

java.lang.ExceptionInInitializerError at com.test.appname.FinderMain$1.gotLocation(FinderMain.java:286) at com.test.appname.MyLocation$GetLastLocation.run(MyLocation.java:89) at java.util.Timer$TimerImpl.run(Timer.java:289) Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() at android.os.Handler.<init>(Handler.java:121) at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) at 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 are both values use the latest one          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);     } } 
like image 534
Lee Armstrong Avatar asked Nov 15 '10 19:11

Lee Armstrong


People also ask

What are the problems in AsyncTask?

In summary, the three most common issues with AsyncTask are: Memory leaks. Cancellation of background work. Computational cost.

Why is AsyncTask deprecated?

This class was deprecated in API level 30.AsyncTask was intended to enable proper and easy use of the UI thread. However, the most common use case was for integrating into UI, and that would cause Context leaks, missed callbacks, or crashes on configuration changes.

What happens to AsyncTask if activity is destroyed?

If you start an AsyncTask inside an Activity and you rotate the device, the Activity will be destroyed and a new instance will be created. But the AsyncTask will not die. It will go on living until it completes.

Is it possible to start AsyncTask from background thread?

Android App Development for Beginners Android AsyncTask going to do background operation on background thread and update on main thread. In android we cant directly touch background thread to main thread in android development. asynctask help us to make communication between background thread to main thread.


2 Answers

Long story:

AsyncTask internally uses a Handler. A handler basically allows you to post Runnables from another thread on the thread the handler was assigned to, which in the case of AsyncTask is always the thread from which it is called. This only works for threads that have a Looper prepared, though.

For more information see http://developer.android.com/reference/android/os/Handler.html

Short story:

Simply wrap every call to FinderMain$1.gotLocation or the creation of AsyncTask within it in a Runnable, and post it to a Handler bound to the UI thread, like 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);           }        });        // ...      } } 
like image 144
Timo Ohr Avatar answered Sep 22 '22 23:09

Timo Ohr


I tried this...It worked,hope it will help you..

protected class Asyctast extends AsyncTask<String, Integer, Integer> {      @Override     protected Integer doInBackground(String... params) {         // TODO Auto-generated method stub           Log.d("Asynctask", ""+params);   Looper.prepare();              ImageThumbnailsActivity m = new ImageThumbnailsActivity();              Toast.makeText(ImageThumbnailsActivity.this,""+params ,Toast.LENGTH_SHORT).show();             final Dialog dialog_options = new Dialog(ImageThumbnailsActivity.this);             dialog_options.setContentView(R.layout.option);             dialog_options.show();         Looper.loop();         return null;     }        } 
like image 31
Nilesh Tupe Avatar answered Sep 21 '22 23:09

Nilesh Tupe