Cancel the Runnable in the .runOnFirstFix() method of LocationOverlay Object

风流意气都作罢 提交于 2019-12-23 03:04:19

问题


I have an application the leans heavily on map functionality. From the first Activity I call the runOnFirstFix() method to load a lot of data from a database once the location of the user has been found, but I also want to be able to interrupt this runnable and stop it mid execution for when I switch activity or the user presses the button to stop it running.

myLocationOverlay.runOnFirstFix(new Runnable() {
            public void run() {
                mc.animateTo(myLocationOverlay.getMyLocation());
                mc.setZoom(15);
                userLatitude = myLocationOverlay.getMyLocation().getLatitudeE6();
                userLongitude = myLocationOverlay.getMyLocation().getLongitudeE6();
                userLocationAcquired = true;
                loadMapData();  //Here the method is called for heavy data retrieval    
            }
        });

How can I stop this Runnable mid execution?


回答1:


use the handler object to handle this runnable.

define this runnable with the runnable object.

after that in handler you can start the cancel this runnable service

for e.g.

Handler handler = new Handler();

on startCommand()

handler.postDelayed(myRunnable,5000);

this will execute the run method of runnable after 5 sec

for cancel

handler.removeCallbacks(myRunnable);

and your runnable define like this way

private Runnable myRunnable = new Runnable(){
      public void run(){
          // do something here
      }
}

http://developer.android.com/reference/android/os/Handler.html

http://developer.android.com/reference/java/util/logging/Handler.html

http://www.vogella.de/articles/AndroidPerformance/article.html




回答2:


You could (and probably should) use an AsyncTask

private class MapLoader extends AsyncTask<Void, Void, Data> {
    @Override
    protected Data doInBackground(Void... params) {
        return loadMapData();  //Here the method is called for heavy data retrieval, make it return that Data  
    }
    @Override
    protected void onPostExecute(Data result) {
    //do things with your mapview using the loaded Data (this is executed by the uithread)
    }
}

and then in replace your other code with

final MapLoader mapLoader = new MapLoader();
myLocationOverlay.runOnFirstFix(new Runnable() {
    public void run() {
        mc.animateTo(myLocationOverlay.getMyLocation());
        mc.setZoom(15);
        userLatitude = myLocationOverlay.getMyLocation().getLatitudeE6();
        userLongitude = myLocationOverlay.getMyLocation().getLongitudeE6();
        userLocationAcquired = true;
        mapLoader.execute();
    }
});

then you should be able to cancel the running task when you no longer want it to complete using

mapLoader.cancel(true);

I hope the code compiles, I haven't tested it, but it should work :)

Just make sure that it is the ui thread that creates the MapLoader

edit: I think you need to wrap the mapLoader.execute(); call in a runOnUiThread() call in order for it to work correctly since runOnFirstFix() might spawn a new thread




回答3:


In Java, you can call interrupt() on a running thread which should stop the execution of given thread. But if any kind of blocking operation like wait() or join() is being performed, InterruptedException will be thrown. Even some kinds of socket-related blocking operations can lead to InterruptedIOException under Linux, or under Windows the operation still remains blocked (since Windows does not support interruptible I/O). I think you still could interrupt your runnable, just be aware that some I/O may not be interrupted until finished and if blocking, it might throw those kind of exceptions I mentioned.



来源:https://stackoverflow.com/questions/6665798/cancel-the-runnable-in-the-runonfirstfix-method-of-locationoverlay-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!