[android] #3900 - Using CopyWriteArrayList to avoid concurrency issues with MapChangeListeners
This commit is contained in:
@@ -88,7 +88,9 @@ import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@@ -124,7 +126,7 @@ public class MapView extends FrameLayout {
|
||||
private ImageView mAttributionsView;
|
||||
private UserLocationView mUserLocationView;
|
||||
|
||||
private List<OnMapChangedListener> mOnMapChangedListener;
|
||||
private CopyOnWriteArrayList<OnMapChangedListener> mOnMapChangedListener;
|
||||
private ZoomButtonsController mZoomButtonsController;
|
||||
private ConnectivityReceiver mConnectivityReceiver;
|
||||
private float mScreenDensity = 1.0f;
|
||||
@@ -164,7 +166,7 @@ public class MapView extends FrameLayout {
|
||||
}
|
||||
|
||||
private void initialize(@NonNull Context context, @Nullable AttributeSet attrs) {
|
||||
mOnMapChangedListener = new ArrayList<>();
|
||||
mOnMapChangedListener = new CopyOnWriteArrayList<>();
|
||||
mMapboxMap = new MapboxMap(this);
|
||||
mAnnotations = new ArrayList<>();
|
||||
mIcons = new ArrayList<>();
|
||||
@@ -2440,9 +2442,11 @@ public class MapView extends FrameLayout {
|
||||
// Forward to any listeners
|
||||
protected void onMapChanged(int mapChange) {
|
||||
if (mOnMapChangedListener != null) {
|
||||
int count = mOnMapChangedListener.size();
|
||||
for (int i = 0; i < count; i++) {
|
||||
mOnMapChangedListener.get(i).onMapChanged(mapChange);
|
||||
OnMapChangedListener listener;
|
||||
final Iterator<OnMapChangedListener>iterator= mOnMapChangedListener.iterator();
|
||||
while(iterator.hasNext()){
|
||||
listener = iterator.next();
|
||||
listener.onMapChanged(mapChange);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,25 +39,13 @@ public class MyLocationTrackingModeActivity extends AppCompatActivity implements
|
||||
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
|
||||
setSupportActionBar(toolbar);
|
||||
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
final ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setDisplayShowTitleEnabled(false);
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
actionBar.setDisplayShowHomeEnabled(true);
|
||||
}
|
||||
|
||||
ArrayAdapter<CharSequence> locationTrackingAdapter = ArrayAdapter.createFromResource(actionBar.getThemedContext(), R.array.user_tracking_mode, android.R.layout.simple_spinner_item);
|
||||
locationTrackingAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
mLocationSpinner = (Spinner) findViewById(R.id.spinner_location);
|
||||
mLocationSpinner.setAdapter(locationTrackingAdapter);
|
||||
mLocationSpinner.setOnItemSelectedListener(this);
|
||||
|
||||
ArrayAdapter<CharSequence> bearingTrackingAdapter = ArrayAdapter.createFromResource(actionBar.getThemedContext(), R.array.user_bearing_mode, android.R.layout.simple_spinner_item);
|
||||
bearingTrackingAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
mBearingSpinner = (Spinner) findViewById(R.id.spinner_bearing);
|
||||
mBearingSpinner.setAdapter(bearingTrackingAdapter);
|
||||
mBearingSpinner.setOnItemSelectedListener(this);
|
||||
|
||||
mMapView = (MapView) findViewById(R.id.mapView);
|
||||
mMapView.setAccessToken(ApiAccess.getToken(this));
|
||||
mMapView.onCreate(savedInstanceState);
|
||||
@@ -68,6 +56,18 @@ public class MyLocationTrackingModeActivity extends AppCompatActivity implements
|
||||
|
||||
mapboxMap.setOnMyLocationChangeListener(MyLocationTrackingModeActivity.this);
|
||||
|
||||
ArrayAdapter<CharSequence> locationTrackingAdapter = ArrayAdapter.createFromResource(actionBar.getThemedContext(), R.array.user_tracking_mode, android.R.layout.simple_spinner_item);
|
||||
locationTrackingAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
mLocationSpinner = (Spinner) findViewById(R.id.spinner_location);
|
||||
mLocationSpinner.setAdapter(locationTrackingAdapter);
|
||||
mLocationSpinner.setOnItemSelectedListener(MyLocationTrackingModeActivity.this);
|
||||
|
||||
ArrayAdapter<CharSequence> bearingTrackingAdapter = ArrayAdapter.createFromResource(actionBar.getThemedContext(), R.array.user_bearing_mode, android.R.layout.simple_spinner_item);
|
||||
bearingTrackingAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
mBearingSpinner = (Spinner) findViewById(R.id.spinner_bearing);
|
||||
mBearingSpinner.setAdapter(bearingTrackingAdapter);
|
||||
mBearingSpinner.setOnItemSelectedListener(MyLocationTrackingModeActivity.this);
|
||||
|
||||
try {
|
||||
mapboxMap.setMyLocationEnabled(true);
|
||||
} catch (SecurityException e) {
|
||||
|
||||
Reference in New Issue
Block a user