2017-01-02 13 views
0

フラグメント内にマップを実装しました。現在の場所が必要なので、場所を返すLocation listenerを実装しました。私はすべての商人を取得するためにAPIを呼び出すので、私は商人のリストを取得します。そのリストから私は商人の緯度と経度を取得します。フラグメントをナビゲートしようとしたときにgetActivity()でNULLポインタ例外が発生する

私が最初にアプリを起動し、ホームアクティビティにあるSearchMerchantフラグメントに移動すると、マップが追加されます。私は現在の位置とマーカーを見ることができます。もし別のフラグメントに戻り、SearchMerchantフラグメントに来たら、onLocationChangedメソッドでネットワーク接続をチェックしようとするとnullポインタ例外が発生します。

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クラス:

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) { 

     } 

    } 

} 

が、私は一度の場所を取得し、商人のリストを取得するために非同期タスクを呼び出したいです。場所を取得した後、私はonLocationChangeメソッドで非同期タスクを呼び出すときに、ロケーションを取得するのをやめたいので、場所が変わるとすぐに非同期タスクを呼び出します。それは頻繁に起こる。

ここで何が問題になりますか?助けてください、ありがとうございます..

答えて

0

setUpUI(view);onCreateView()に電話しています。これはgetLocation()です。 getLocation()では、LocationManagerインスタンスを取得するためにgetActivity()を呼び出しています。 onCreateView()で呼び出すため、getActivity()はnullを返しています。

問題onCreateView()にはgetContext()またはgetActivity()をコールしないでください。アクティビティが作成されているという保証がないため、コンテキストがnullになることがあります。これは時々いつも起こるわけではありません。

注:onCreateView()で文脈を取得しないようにする必要があります。onActivityCreated()で取得してください。を修正することは非常にシンプルな

:またあなたのgetLocation()この状況で保証されてonActivityCreated()でコールあなたがコンテキストを取得し、コンテキストを使用してすべてのメソッドや線を移動し :)

+0

まだ、nullポインタ例外が発生し、マップ上でフラグメントからナビゲートすると位置がわかりません。 – Sid

0

チェック

CommonUtils.isConnectedToInternet(getActivity()) 

参照の場合getActivity()はあなたにnullを返していません。

move getLocation();のメソッドinside onActivityCreated()またはonConnect()で呼び出す必要があります。

+0

まだnullポインタ例外が発生し、マップ上でフラグメントからナビゲートすると位置がわかりません – Sid

関連する問題