取消LocationOverlay对象的.runOnFirstFix()方法中的Runnable

时间:2011-07-12 14:27:47

标签: java android multithreading interrupt runnable

我有一个应用程序倾向于严重依赖地图功能。从第一个Activity调用runOnFirstFix()方法,一旦找到用户的位置,就从数据库加载大量数据,但我也希望能够中断这个runnable并在执行中停止它我切换活动或用户按下按钮停止运行。

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    
            }
        });

如何停止执行Runnable?

3 个答案:

答案 0 :(得分:2)

您可以(也可能应该)使用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)
    }
}

然后用

替换你的其他代码
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();
    }
});

然后,当您不再希望使用

完成时,您应该可以取消正在运行的任务
mapLoader.cancel(true);

我希望代码编译,我还没有测试过,但它应该工作:)

确保它是创建MapLoader的ui线程

编辑:我认为您需要在mapLoader.execute();调用中包含runOnUiThread()调用才能使其正常工作,因为runOnFirstFix()可能会生成新线程

答案 1 :(得分:1)

使用handler对象来处理这个runnable。

使用runnable对象定义此runnable。

之后在处理程序中你可以开始取消这个可运行的服务

例如

Handler handler = new Handler();

on startCommand()

handler.postDelayed(myRunnable,5000);

这将在5秒后执行runnable的run方法

取消

handler.removeCallbacks(myRunnable);

和你的runnable这样定义

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 :(得分:0)

在Java中,您可以在正在运行的线程上调用interrupt(),该线程应该停止执行给定的线程。但是,如果正在执行任何类型的阻止操作,例如wait()join(),则会抛出InterruptedException。甚至某些类型的与套接字相关的阻塞操作也可能导致Linux下的InterruptedIOException,或者在Windows下,操作仍然被阻止(因为Windows不支持可中断的I / O)。我认为你仍然可以打断你的runnable,只要知道一些I / O可能不会被中断直到完成,如果阻塞,它可能会抛出我提到的那种异常。

相关问题