Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 取消LocationOverlay对象的.runOnFirstFix()方法中的Runnable_Java_Android_Multithreading_Interrupt_Runnable - Fatal编程技术网

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

Java 取消LocationOverlay对象的.runOnFirstFix()方法中的Runnable,java,android,multithreading,interrupt,runnable,Java,Android,Multithreading,Interrupt,Runnable,我有一个应用程序非常依赖地图功能。从第一个活动开始,我调用runOnFirstFix()方法,在找到用户位置后从数据库加载大量数据,但我还希望能够在切换活动或用户按下按钮停止运行时中断此runnable并在执行中停止它 myLocationOverlay.runOnFirstFix(new Runnable() { public void run() { mc.animateTo(myLocationOverlay.getMyLocatio

我有一个应用程序非常依赖地图功能。从第一个活动开始,我调用
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    
            }
        });

如何停止此可运行的中间执行?

使用handler对象来处理此可运行的

使用runnable对象定义此runnable

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

例如

Handler handler = new Handler();
关于startCommand()

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

取消

handler.removeCallbacks(myRunnable);
你的runnable就是这样定义的

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


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

您可以(而且可能应该)使用

然后,您应该能够在不再希望使用完成正在运行的任务时取消该任务

mapLoader.cancel(true);
我希望代码可以编译,我还没有测试过它,但它应该可以工作:)

只需确保创建MapLoader的是ui线程


编辑:我认为您需要包装
mapLoader.execute()调用
runOnUiThread()
调用以使其正常工作,因为
runOnFirstFix()
可能会生成一个新线程

这将如何使您能够在启动后停止执行
myRunnable
,如何获取调用Runnable的线程的引用,该线程来自runOnFirstFix()方法?我不是安卓专家,但在检查了
MyLocationOverlay
的源代码后,我发现传入的Runnable实际上甚至没有在单独的线程中执行。因此,您可以在执行本身开始之前调用
runOnFirstFix(null)
,或者在执行期间停止它,您必须创建
线程
(实现
Runnable
)。
线程
不起作用,因为底层代码将它用作简单的
Runnable
对象,并且只使用
run()
方法,忽略您提供的
线程这一事实。getekha:您完全正确,我昨天可能很累:(另一种方法是从传入的
可运行的
启动您自己的线程。
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);