【问题标题】:Getting null pointer exception on getActivity() when trying to navigate through fragments尝试浏览片段时在 getActivity() 上获取空指针异常
【发布时间】:2017-01-02 12:22:59
【问题描述】:

我已经在片段中实现了地图。我想要当前位置,所以我实现了返回位置的位置侦听器。我正在调用一个 api 来获取所有商家,所以我得到了商家列表。从该列表中,我得到了商家的纬度和经度。

当我第一次启动应用程序并转到家庭活动中的 SearchMerchant 片段时,其中添加了地图。我可以看到当前位置和标记,如果我回到另一个片段并再次来到 SearchMerchant 片段,当我尝试在 onLocationChanged 方法中检查网络连接时,我会得到空指针异常。

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;
}

搜索地图片段:

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 方法中调用异步任务时,它会在位置更改后立即开始调用异步任务。所以经常发生。

这里出了什么问题?请帮忙,谢谢..

【问题讨论】:

    标签: java android google-maps android-fragments location


    【解决方案1】:

    检查

    CommonUtils.isConnectedToInternet(getActivity())
    

    查看 getActivity() 是否没有返回 null。

    将您的 getLocation(); 方法移入 onActivityCreated() 或应在 onConnect() 中调用;

    【讨论】:

    • 仍然出现空指针异常,如果从片段导航,我在地图上看不到位置
    【解决方案2】:

    您在调用getLocation()onCreateView() 中调用setUpUI(view);。在您的 getLocation() 中,您正在调用 getActivity() 以获取 LocationManager 实例。 getActivity() 正在返回 null,因为您在 onCreateView() 中调用它。

    问题是您不应该在onCreateView() 中调用getContext()getActivity(),因为无法保证活动已创建,因此上下文将为空。这种情况只会在某个时候发生,而不是一直发生。

    注意:你应该养成不要在onCreateView()中获取上下文的习惯,在onActivityCreated()中获取它。

    修复非常简单: 将您的getLocation() 调用移动到onActivityCreated() 中,这保证在这种情况下您可以获得上下文以及所有使用上下文的方法或行:)

    【讨论】:

    • 仍然出现空指针异常,如果从片段导航,我在地图上看不到位置。
    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 2013-05-14
    相关资源
    最近更新 更多