2017-01-02 3 views
0

Ich habe Map in Fragment implementiert. Ich möchte den aktuellen Standort, also habe ich Location Listener implementiert, der den Standort zurückgibt. Ich rufe eine API an, um alle Händler zu bekommen, damit ich die Händlerliste bekomme. Aus dieser Liste erhalte ich den Längen- und Breitengrad der Händler.Nullzeigerausnahme auf getActivity() erhalten, wenn versucht wird, durch Fragmente zu navigieren

Wenn ich die App zum ersten Mal starte und zum SearchMerchant-Fragment gehe, das sich in Home-Aktivitäten befindet, wird Map hinzugefügt. Ich kann den aktuellen Standort und den Marker sehen und wenn ich zu einem anderen Fragment zurückgehe und wieder zum SearchMerchant-Fragment komme, bekomme ich die Nullzeiger-Ausnahme, wenn ich versuche, in der onLocationChanged-Methode nach einer Netzwerkverbindung zu suchen.

Process: com.kiranacustomerapp, PID: 9934 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference 
                      at com.kiranacustomerapp.helper.CommonUtils.isConnectedToInternet(CommonUtils.java:44)                   at com.kiranacustomerapp.Fragments.SearchMerchantFragment.onLocationChanged(SearchMerchantFragment.java:373) 
                     at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:297) 

CommonUtils Klasse:

public static boolean isConnectedToInternet(Context context) { 

    ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    if (manager != null) { 
     NetworkInfo[] info = manager.getAllNetworkInfo(); 
     if (info != null) { 
      for(int i=0;i<info.length;i++) { 
       if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
        return true; 
       } 
      } 
     } 
    } 

    return false; 
} 

SearchMapFragment:

public class SearchMerchantFragment extends Fragment implements GetSearchedMerchantsAsyncTask.GetSearchedMerchantsCallBack,OnMapReadyCallback , GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{ 
    // TODO: Rename parameter arguments, choose names that match 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // getLocation(); 

     initializeLocationManager(); 
     requestLocation(); 

    } 

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

     setUpUI(view); 


     return view; 
    } 


    public void setUpUI(View view) { 

     setUpMapIfNeeded(); 



    } 

    @Override 
    public void doPostExecute(ArrayList<Merchants> merchantsArrayList) { 

     merchantsList.clear(); 
     merchantsList.addAll(merchantsArrayList); 
     merchantsAdapter.notifyDataSetChanged(); 
    } 

    //get searched merchants 
    public void accessMerchants() { 
     if (CommonUtils.isConnectedToInternet(getContext())) { 
      new GetSearchedMerchantsAsyncTask(getActivity(), SearchMerchantFragment.this).execute(access_token, sessionUserId,String.valueOf(mLastLocation.getLatitude()),String.valueOf(mLastLocation.getLongitude())); 
     } else { 
      showAlert(String.valueOf(R.string.check_network)); 
     } 
    } 


    private void setUpMapIfNeeded() { 
     if (mGoogleMap == null) { 
      mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map_fragment); 
      mapFragment.getMapAsync(this); 
      // getLocation(); 
     } 
    } 

    //setup map 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mGoogleMap = googleMap; 

     buildGoogleApiClient(); 

     mGoogleApiClient.connect(); 

    } 

    protected synchronized void buildGoogleApiClient() { 
     // Toast.makeText(getActivity(),"buildGoogleApiClient",Toast.LENGTH_SHORT).show(); 
     mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     // Toast.makeText(getActivity(),"onConnected",Toast.LENGTH_SHORT).show(); 

    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     // Toast.makeText(getActivity(),"onConnectionSuspended",Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     // Toast.makeText(getActivity(),"onConnectionFailed",Toast.LENGTH_SHORT).show(); 
    } 


    private class LocationListener implements android.location.LocationListener { 

     private static final String TAG = "GPS"; 

     public LocationListener(String provider) { 
      Log.e(TAG, "LocationListener " + provider); 
      mLastLocation = new Location(provider); 
     } 

     @Override 
     public void onLocationChanged(Location location) { 
      Log.e(TAG, "onLocationChanged: " + location); 
      mLastLocation.set(location); 
      try { 

       if (mLastLocation != null) { 

        //place marker at current position 
        // mGoogleMap.clear(); 
        mLatLang = new LatLng(mLastLocation.getLatitude(),mLastLocation.getLongitude()); 

        accessMerchants(); 

        MarkerOptions markerOptions = new MarkerOptions(); 
        markerOptions.position(mLatLang); 
        markerOptions.title(getString(R.string.position)); 
        markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)); 
        mMarker = mGoogleMap.addMarker(markerOptions); 

        CameraPosition cameraPosition = new CameraPosition.Builder().target(mLatLang).zoom(14).build(); 

        mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

        mLocationRequest = new LocationRequest(); 
        mLocationRequest.setInterval(5000); //5 seconds 
        mLocationRequest.setFastestInterval(3000); //3 seconds 
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 

        mGoogleMap.setMyLocationEnabled(true); 
        mGoogleMap.getUiSettings().setZoomControlsEnabled(true); 
        mGoogleMap.getUiSettings().setAllGesturesEnabled(true); 

        for (Merchants merchants : merchantsList) { 
         LatLng latLng = new LatLng(merchants.getLatitude(), merchants.getLongitude()); 
         MarkerOptions marker = new MarkerOptions().position(latLng).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)).title(merchants.getKirana_name()); 
         Marker m = mGoogleMap.addMarker(marker); 
         markers.add(m); 
        } 
       } 
      } catch (SecurityException e) { 

      } 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      Log.e(TAG, "onProviderDisabled: " + provider); 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      Log.e(TAG, "onProviderEnabled: " + provider); 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      Log.e(TAG, "onStatusChanged: " + provider); 
     } 
    } 

    LocationListener[] mLocationListeners = new LocationListener[]{ 
      new LocationListener(LocationManager.GPS_PROVIDER), 
      new LocationListener(LocationManager.NETWORK_PROVIDER) 
    }; 
    private void initializeLocationManager() { 

     if (mLocationManager == null) { 
      mLocationManager = (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE); 
     } 
    } 

    public void requestLocation() { 

     try { 
      mLocationManager.requestLocationUpdates(
        LocationManager.NETWORK_PROVIDER, 0,0, 
        mLocationListeners[1]); 
     } catch (java.lang.SecurityException ex) { 

     } catch (IllegalArgumentException ex) { 

     } 

     try { 
      mLocationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER,0,0, 
        mLocationListeners[0]); 
     } catch (java.lang.SecurityException ex) { 

     } catch (IllegalArgumentException ex) { 

     } 

    } 

} 

Ich möchte einmal den Standort erhalten und die async Aufgabe nennen Händler-Liste zu erhalten. Nachdem ich die Position erhalten habe, an der ich den Standort abbrechen möchte, beginnt ich jetzt beim Aufruf der asynchronen Task in der onLocationChange-Methode den asynchronen Task aufzurufen, sobald sich der Standort ändert. so passiert es häufig.

Was läuft hier falsch? Bitte helfen Sie, danke.

Antwort

0

Sie rufen setUpUI(view); in onCreateView(), die getLocation() ruft. In Ihrem getLocation() rufen Sie getActivity() an, um LocationManager Instanz zu erhalten. getActivity() gibt null zurück, da Sie das in onCreateView() aufrufen.

Problem ist, dass Sie getContext() oder getActivity() in onCreateView() nicht aufrufen sollten, da es keine Garantie gibt, dass die Aktivität erstellt wird, so dass Kontext null sein wird. Dies passiert nur manchmal nicht die ganze Zeit.

Hinweis: Sie sollten eine Gewohnheit machen nicht den Kontext, in onCreateView() zu erhalten, erhält es in onActivityCreated().

Sehr einfache zu beheben: Ihre getLocation() Anruf in onActivityCreated() bewegen, die in dieser Situation garantiert Ihnen den Kontext erhalten und auch alle Methoden oder Zeilen, die Kontext verwendet :)

+0

immer noch null Zeigerausnahme und auf der Karte kann ich nicht sehen, wenn die Navigation von Fragmenten. – Sid

0

Check

CommonUtils.isConnectedToInternet(getActivity()) 

sehen, wenn getActivity() gibt Sie nicht null zurück.

Verschieben Sie Ihre getLocation(); Methode innerhalb onActivityCreated() oder sollte onConnect() aufgerufen werden;

+0

immer noch Null-Zeiger Ausnahme und auf der Karte kann ich nicht sehen, wenn die Navigation von Fragmenten – Sid

Verwandte Themen