IllegalArgumentException: неуправляемый дескриптор - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь запускать гео-запрос каждый раз, когда кто-то выбирает место из фрагмента PlaceAutoComplete и показывает маркеры на карте.Во-первых, все работает нормально. Когда я запускаю приложение, все иконки в порядке, геоквартия работает нормально, но когда я вхожу в локацию во второй раз, приложение вылетает, показывая ошибку llegalArgumentException: неуправляемый дескриптор нижеэто то, что я пытаюсь сделать.

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

 SupportPlaceAutocompleteFragment autocompleteFragment = 
 (SupportPlaceAutocompleteFragment)

 getChildFragmentManager().findFragmentById
 (R.id.place_autocomplete_fragment);

    autocompleteFragment.setOnPlaceSelectedListener(new 
  PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {
            // TODO: Get info about the selected place.

   Toast.makeText(getContext(),place.getAddress(),Toast.LENGTH_LONG).show();
            Log.i(TAG, "Place: " + place.getName());

            Double latitude1 = place.getLatLng().latitude;
            Double longitude1 =place.getLatLng().longitude;
            LatLng latLng = new LatLng(latitude1,longitude1);

            getPeople(latLng); // method to call geofire query
        }

        @Override
        public void onError(Status status) {
            // TODO: Handle the error.
            Log.i(TAG, "An error occurred: " + status);
        }
    });
    return mMainView;
}


public void getPeople(LatLng latLng1){
mMap.clear();
mMap.addCircle(new CircleOptions()
        .center(latLng1)
        .radius(2000)
        .strokeColor(Color.BLACK)
        .fillColor(0x220000FF)
        .strokeWidth(1)
 );
 DatabaseReference ref = 
 FirebaseDatabase.getInstance().getReference().child("Location");
 GeoFire geoFire = new GeoFire(ref);
 GeoQuery geoQuery = geoFire.queryAtLocation(new 
 GeoLocation(latLng1.latitude, latLng1.longitude), 2);
 geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
    @Override
    public void onKeyEntered(final String key, GeoLocation location) {
  UIDLocation.put(key,location);
 marker.setIcon(BitmapDescriptorFactory.fromResource
 (R.drawable.ic_mapmarker2));
        markers.put(key, marker);
 for (Map.Entry<String,GeoLocation> entry : UIDLocation.entrySet())
        {
        final Marker marker = markers.get(entry.getKey());
        if (marker != null) {
        DatabaseReference mUser = 
              FirebaseDatabase.getInstance().getReference().child("People")
              .child(string);
                    mUser.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) 
  {
                            String display_name = 
                         dataSnapshot.child("name").getValue().toString();
                            String status = 
                         dataSnapshot.child("status").getValue().toString();
                            String image = 
                          dataSnapshot.child("image").getValue().toString();
                            PeopleInfo info = new PeopleInfo();
                            info.setName(display_name);
                            info.setStatus(status);
                            info.setImage(image);
                            marker.setTag(info);
     String iconName = dataSnapshot.child("iconName")
                      .getValue().toString();
   Context context = getContext();
   int id = context.getResources().getIdentifier(iconName, "drawable", 
   context.getPackageName());
   String s = String.valueOf(id);

   Bitmap icon = BitmapFactory.decodeResource(context.getResources(),id);
   marker.setIcon(BitmapDescriptorFactory.fromResource(id));
   }

                                @Override
                                public void onCancelled(DatabaseError 
                   databaseError) {

                                }
                            });
                         }
                     }

  @Override
  public void onMapReady(final GoogleMap googleMap) {
    mMap = googleMap;
    mUiSettings = mMap.getUiSettings();
    mUiSettings.setZoomControlsEnabled(true);
    mFusedLocationClient =
            LocationServices.getFusedLocationProviderClient(getContext());

            Task task= mFusedLocationClient.getLastLocation()
            .addOnSuccessListener(getActivity(), new 
            OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {              
                    if (location != null) {
                        double latitude = location.getLatitude();
                        double longitude = location.getLongitude();
                        LatLng latLng = new LatLng(latitude, longitude);
                        myPosition = new LatLng(latitude, longitude);
                        markeroptn = new MarkerOptions();
                        markeroptn.position(myPosition);
                        markeroptn.title("You are Here");
   mMap.moveCamera(CameraUpdateFactory.newLatLng(myPosition));           
   mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(myPosition,10));
                        getWorkMen(myPosition);



                    }
                }
            });

Пока что я узнал из сообщений на SO, что это потому, что программа пытается установить значок на маркер, который уже там.Я пробовал карту clear () в начале getPeople (), но все равно она показывает ту же ошибку. Сначала она работает нормально.я также попытался удалить () также, но его тоже не работает.

1 Ответ

0 голосов
/ 31 мая 2018

Проблема может быть связана с тем, как вы управляете переменными Marker.В коде вы храните переменную marker как глобальную за пределами области действия метода.При вызове map.clear() переменная marker становится недействительной, и, если вы по-прежнему используете эту переменную для установки чего-либо, это может вызвать исключение.То же самое происходит с markers картой, которую вы используете для отображения key и Marker, она не очищается при map.clear().

Старайтесь более тщательно управлять элементами вашей карты, очищайте каждый элемент карты по отдельности и избегайте использования map.clear().

Подход предложения:

Создать новый маркер

private void addMarker(String key, LatLng latLng) {
    // Clear the current marker before add the new one
    if (marker != null) {
        marker.remove();
        marker = null;
    }

    // Store new marker to the variable
    marker = mMap.addCircle(new CircleOptions()
        .center(latLng)
        .radius(2000)
        .strokeColor(Color.BLACK)
        .fillColor(0x220000FF)
        .strokeWidth(1)
    );

    // Add to markers map if needed
    markers.put(key, marker);
}

Очистить все маркеры (очистить вручную каждую доступную переменную маркера, не использовать map.clear:

public synchronized void clear() {
    // markers is the marker map
    for (Marker marker : markers.values()) {
        try {
            marker.remove();
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        }
    }

    // Clear all the marker map
    markers.clear();

    // Marker is the your global marker variable
    marker.remove();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...