我有一个应用程序倾向于严重依赖地图功能。从第一个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?
答案 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可能不会被中断直到完成,如果阻塞,它可能会抛出我提到的那种异常。