2015-08-13 4 views
1

У меня есть фрагмент, и я использую метод getMapAsync из API Карт Google, он работает правильно.Android Google Map + Pusher (в реальном времени) Слушатель

В то же время, я хочу подключить свое приложение к Pusher, и в каждом случае, которое я получаю, я хочу поместить маркер на карту (я хочу показать все местоположения пользователей в режиме реального времени, когда они подключаются к приложение).

Все работает так, как это предполагалось, но я не могу получить доступ к var googleMap внутри прослушивателя Pusher (метод onEvent). Зачем??

Я новичок в программировании на Java, и я думаю, что я делаю что-то очень неправильно,:/

public class HomeFragment extends Fragment implements OnMapReadyCallback,PresenceChannelEventListener{ 

private me.agiliza.agilizame.models.User _user; 
private View _view; 
private MapView _map; 
private GoogleMap _googleMap; 
private Pusher _pusher; 
private PresenceChannel _presenceChannel; 
private boolean _isSubscribedToPresence; 

public HomeFragment() { 
    // Required empty public constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    _view = inflater.inflate(R.layout.fragment_home, container, false); 

    _user = UserManager.getInstance(getActivity().getApplicationContext()); 

    _map = (MapView) _view.findViewById(R.id.vMap); 

    _map.onCreate(savedInstanceState); 
    _map.onResume(); // needed to get the map to display immediately 

    MapsInitializer.initialize(getActivity().getApplicationContext()); 

    _map.getMapAsync(this); 

    return _view; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    _map.onResume(); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    _map.onPause(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    _map.onDestroy(); 
} 

@Override 
public void onLowMemory() { 
    super.onLowMemory(); 
    _map.onLowMemory(); 
} 


@Override 
public void onMapReady(GoogleMap googleMap) { 
    Log.i("Carregou", "Mapa"); 
    _googleMap = googleMap; 
    _googleMap.setMyLocationEnabled(true); 
    _googleMap.getUiSettings().setMyLocationButtonEnabled(false); 

    loadConnectedProviders(); 

    _googleMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() { 
     @Override 
     public void onMyLocationChange(Location location) { 
      if (_isSubscribedToPresence) { 
       LatLng coordinates = new LatLng(location.getLatitude(), location.getLongitude()); 
       _googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(coordinates, 15)); 
       Log.d(Utils.TAG, "Atualizou localização"); 
       _googleMap.setMyLocationEnabled(false); 
       _googleMap.addMarker(new MarkerOptions().position(coordinates)).setTitle("Minha localização"); 

       JSONObject jsonObject = new JSONObject(); 
       try { 
        jsonObject.put("id", _user.getId()); 
        jsonObject.put("latitude", coordinates.latitude); 
        jsonObject.put("longitude", coordinates.longitude); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

       _presenceChannel.trigger("client-locup", jsonObject.toString()); 
      } 
     } 
    }); 

} 

public void loadConnectedProviders(){ 
    _pusher = PusherManager.getInstance(getActivity()); 
    _pusher.unsubscribe("presence-providers"); 
    _presenceChannel = _pusher.subscribePresence("presence-providers", this, "client-locup"); 

} 

@Override 
public void onUsersInformationReceived(String channelName, Set<User> users) {} 

@Override 
public void userSubscribed(String channelName, User user) { 
} 

@Override 
public void userUnsubscribed(String channelName, User user) {} 

@Override 
public void onAuthenticationFailure(String message, Exception e) { 
    _isSubscribedToPresence = false; 
} 

@Override 
public void onSubscriptionSucceeded(String channelName) { 
    _isSubscribedToPresence = true; 
} 

@Override 
public void onEvent(String channelName, String eventName, String data) { 
      try { 
       JSONObject jsonObject = new JSONObject(data); 
       int userId = jsonObject.getInt("id"); 
       LatLng latLng = new LatLng(jsonObject.getDouble("latitude"),jsonObject.getDouble("longitude")); 

       // I cant get this to work 
       //_googleMap.addMarker(new MarkerOptions().position(latLng)); 

       Log.d(Utils.TAG, "Id is " + userId + " Value of lat is " + latLng.latitude + " and long is " + latLng.longitude); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

} 

}

+1

Совет 1: всегда проверяйте, не имеет ли ваша карта нулевая сторона onMapReady(), Совет 2: используйте очередь для обработки вашего маркера. Добавление слишком большого количества маркеров сразу может заблокировать ваш UI карты. –

+0

Спасибо, я думаю, проблема не в NullPointerException. –

ответ

2

Вы должны получать NullPointerException, потому что _googleMap не может быть готов. Попробуйте что-то вроде этого.

private final Stack<JSONObject> mPending = new Stack<>(); 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    Log.i("Carregou", "Mapa"); 
    _googleMap = googleMap; 
    syncMarkers(); // <=== LOOK HERE 
    _googleMap.setMyLocationEnabled(true); 
    _googleMap.getUiSettings().setMyLocationButtonEnabled(false); 

    loadConnectedProviders(); 

    _googleMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() { 
     @Override 
     public void onMyLocationChange(Location location) { 
      if (_isSubscribedToPresence) { 
       LatLng coordinates = new LatLng(location.getLatitude(), location.getLongitude()); 
       _googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(coordinates, 15)); 
       Log.d(Utils.TAG, "Atualizou localização"); 
       _googleMap.setMyLocationEnabled(false); 
       _googleMap.addMarker(new MarkerOptions().position(coordinates)).setTitle("Minha localização"); 

       JSONObject jsonObject = new JSONObject(); 
       try { 
        jsonObject.put("id", _user.getId()); 
        jsonObject.put("latitude", coordinates.latitude); 
        jsonObject.put("longitude", coordinates.longitude); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

       _presenceChannel.trigger("client-locup", jsonObject.toString()); 
      } 
     } 
    }); 

} 

    @Override 
    public void onEvent(String channelName, String eventName, String data) { 
     try { 
      JSONObject jsonObject = new JSONObject(data); 
      mPending.add(jsonObject); 
      syncMarkers(); // <=== LOOK HERE 
      Log.d(Utils.TAG, "Id is " + userId + " Value of lat is " + latLng.latitude + " and long is " + latLng.longitude); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void syncMarkers() { 
     if (_googleMap != null) { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        while (!mPending.empty()) { 
         JSONObject jsonObject = mPending.pop(); 
         int userId = jsonObject.getInt("id"); 
         LatLng latLng = new LatLng(jsonObject.getDouble("latitude"), jsonObject.getDouble("longitude")); 
         _googleMap.addMarker(new MarkerOptions().position(latLng)); 
        } 
       } 
      }); 
     } 
    } 
+0

:(Это не работает, но спасибо за вашу помощь. Я думаю, что проблема не в NullPointerException. Вот скриншот проблемы: http://prntscr.com/840h5a –

+2

ошибка указывает, что ваш взгляд не обновляется в UI Thread (aka Main Thread), используйте '' 'runOnUIThread'''' '' syncMarkers() '' '; –

+0

Можете ли вы опубликовать пример о том, как мне реализовать runOnUiThread в моем коде? Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^