1

我有一个非常依赖地图功能的应用程序。从第一个活动runOnFirstFix()开始,一旦找到用户的位置,我就会调用该方法从数据库中加载大量数据,但我也希望能够中断这个可运行对象并在我切换活动或用户按下按钮停止运行。

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 中间执行?

4

3 回答 3

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()可能会产生一个新线程

于 2011-07-12T21:41:25.617 回答
1

使用处理程序对象来处理这个可运行的。

使用可运行对象定义此可运行对象。

之后在处理程序中,您可以启动取消此可运行服务

例如

Handler handler = new Handler();

在开始命令()

handler.postDelayed(myRunnable,5000);

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

取消

handler.removeCallbacks(myRunnable);

并且您的可运行定义像这样

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

于 2011-07-12T14:40:06.040 回答
0

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

于 2011-07-12T14:43:36.670 回答