Вы можете (и, вероятно, должны) использовать 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
edit: я думаю, что вам нужно обернуть вызов mapLoader.execute();
в вызов runOnUiThread()
, чтобы он работал правильно, поскольку runOnFirstFix()
может породить новый поток