Skip to content Skip to sidebar Skip to footer

How To Manage Loopers And Threads (thread Doesn't Die Anymore!)

I created a class extending Thread to retrieve user location through LocationManager in a non-ui thread. I implemented this as a thread because it has to be started on request and

Solution 1:

You can explicitly quit from Looper's loop using Handler:

privateHandlermUserLocationHandler=null;
privateHandlerhandler=null;

publicclassUserLocationThreadextendsThreadimplementsLocationListener {    

 publicvoidrun() {
    try {
          Looper.prepare();
        mUserLocationHandler = newHandler();
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
        Looper.loop();

    } catch (Exception e) {
        //...
    }
}


@OverridepublicvoidonLocationChanged(Location location) {
    locationManager.removeUpdates(this);
    //...
    handler.sendMessage(msg); 
    if(mUserLocationHandler != null){
        mUserLocationHandler.getLooper().quit();
    }
}

Solution 2:

"I implemented this as a tread because it has to be started on request and do its work just for a limited time."

This sounds like a perfect reason to simply reuse the main looper. There's no need to spawn a new Thread here. If you're doing blocking work (network I/O, etc) in onLocationChanged(), at that point you could spin up an ASyncTask.

Implement LocationListener on your Activity/Service or whatever and let it use the main looper by default.

Spawning a new thread, setting it to loop, and then immediately quitting is unnecessary.

Solution 3:

IntentService is good for do this job.

IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand. Clients send requests through startService(Intent) calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.

Solution 4:

Looper().quit(); is good, and according to specification:

Causes the loop() method to terminate without processing any more messages in the message queue.

But, if you have a task that already is under processing, and you want to stop it too, you can acquire working thread and cause it to interrupt:

@Override
public void onLocationChanged(Location location) {
    locationManager.removeUpdates(this);
    handler.sendMessage(msg); //this is the handler for communication with father threadif(mUserLocationHandler != null){
        mUserLocationHandler.getLooper().quit();
        mUserLocationHandler.getLooper().getThread().interrupt(); // <-- here
    }

}

This works fine with most IO, and thread locking/waiting.

Solution 5:

Extend the AsyncTask class. It does all the threading and handling for you automatically.

Post a Comment for "How To Manage Loopers And Threads (thread Doesn't Die Anymore!)"