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