【问题标题】:Getting null when calling method from another class?从另一个类调用方法时获取null?
【发布时间】:2019-11-10 19:21:21
【问题描述】:

我正在尝试从 Listener 类调用方法,但即使我为该类声明了一个对象,它也会引发 nullpointexception。我真的不明白为什么真的。

我尝试向该方法发送一个参数,但这也没有用。

我收到的错误是由于方法 checkGpsStat() 中的调用:

LocationServices.getSettingsClient(MainActivity.this).checkLocationSettings(builder.build())

错误:

尝试调用虚拟方法'android.content.Context android.content.Context.getApplicationContext()' 在一个空对象上 参考

类:- LocationReceiver

public class LocationReceiver extends BroadcastReceiver {

    private static final String TAG = "LocationReceiver";
    private Context mContext;
    private Snackbar snackbar;
    private MainActivity mActicity = new MainActivity();

    public LocationReceiver(Context context, Snackbar snackbar){
        this.mContext = context;
        this.snackbar = snackbar;

    }

    @Override
    public void onReceive(Context context, Intent intent) {

        LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {
            boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            boolean networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
            if(gpsEnabled && networkEnabled) {
                if (snackbar != null) {
                    snackbar.dismiss();
                }
                Log.d(TAG, "GPS enabled");
            } else {

                View view = snackbar.getView();
                FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)view.getLayoutParams();
                params.gravity = Gravity.TOP;
                view.setLayoutParams(params);
                view.setBackgroundColor(Color.parseColor("#123123"));
                snackbar.show();

                mActicity.checkGpsState(); // This call causes crash!

                Log.d(TAG, "GPS disabled");
            }
        }

    }

方法:- checkGpsState()

public void checkGpsState(){

        Log.d(TAG,"checkGpsState started...");

        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);

        // Below code is where the error is firing from! "mainactivity.this". 
        Task<LocationSettingsResponse> result =
                LocationServices.getSettingsClient(MainActivity.this).checkLocationSettings(builder.build());


        result.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
            @Override
            public void onComplete(@NonNull Task<LocationSettingsResponse> task) {

                try {
                    LocationSettingsResponse response = task.getResult(ApiException.class);
                    // All location settings are satisfied. The client can initialize location
                    // requests here.

                    createLocationRequest();        // Start updating location!

                } catch (ApiException exception) {
                    switch (exception.getStatusCode()) {
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            // Location settings are not satisfied. But could be fixed by showing the
                            // user a dialog.
                            try {
                                // Cast to a resolvable exception.
                                ResolvableApiException resolvable = (ResolvableApiException) exception;
                                // Show the dialog by calling startResolutionForResult(),
                                // and check the result in onActivityResult().
                                resolvable.startResolutionForResult(
                                        MainActivity.this,
                                        LocationRequest.PRIORITY_HIGH_ACCURACY);


                            } catch (IntentSender.SendIntentException e) {
                                // Ignore the error.
                            } catch (ClassCastException e) {
                                // Ignore, should be an impossible error.
                            }
                            break;
                        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                            // Location settings are not satisfied. However, we have no way to fix the
                            // settings so we won't show the dialog.
                            break;
                    }
                }
            }
        });
    }

【问题讨论】:

  • 我通过简单地将上下文和活动都传递给 LocationListener 来让它工作。
  • 嗨鲁斯本。最好将完整的解决方案添加到下面的答案中并附上解释。然后,您可以接受自己的答案。最好的问候。
  • @Elletlar 嗨,好的,我会添加它。如果有好的解决方案或坏的解决方案,你能检查一下吗?它有效,但我不确定它是否安全?
  • @Elletlar 现在已发布。你认为这个解决方案安全吗?

标签: android methods nullpointerexception location


【解决方案1】:

哇,终于!我能够解决这个问题。对此非常高兴!

我不确定这是否是最佳解决方案,或者是否安全。但它适用于我,我希望它适用于所有面临这个问题的人。

所以,解决方案来了! 代码左侧的数字是我为使其工作而实施的步骤。希望对您有所帮助!

类:- LocationReceiver

        public class LocationReceiver extends BroadcastReceiver {

        private static final String TAG = "LocationReceiver";
        private Context mContext;
        private Snackbar snackbar;
1       private MainActivity mainActivity;  // Declare activity object

        //NOTE: In the constructor, we pass the activity that fires for this listener, in this case MainActivity.

2        public LocationReceiver(Context context, MainActivity mActivity, Snackbar snackbar){  // Add activity to constructor parameter
            this.mContext = context;
            this.snackbar = snackbar;
3            mainActivity = mActivity;    // set activity with the passed activity.
        }

        @Override
        public void onReceive(Context context, Intent intent) {

            LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

            if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {
                boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
                boolean networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
                if(gpsEnabled && networkEnabled) {
                    if (snackbar != null) {
                        snackbar.dismiss();
                    }
                    Log.d(TAG, "GPS is enabled");
                } else {

                    View view = snackbar.getView();
                    FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)view.getLayoutParams();
                    params.gravity = Gravity.TOP;
                    view.setLayoutParams(params);
                    view.setBackgroundColor(Color.parseColor("#123123"));
                    snackbar.show();

                    // If user turned off location, pass both context, AND activity to the method that handles the gps-dialog.

                    //MARK: - pass both context and activity that we receieved from constructor!
4                   mainActivity.checkGpsState(mContext, mainActivity); // Call method in another activity, pass both context and activity (both is for certain calls in the method in the other activity)

                    Log.d(TAG, "GPS is disabled");
                }
            }

        }
    }

方法:- checkGpsState()

    //checkGps
5    public void checkGpsState(Context mContext, Activity mActivity){  // Here we need to receive the parameter.

        Log.d(TAG,"checkGpsState started...");

        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);

        //MARK: - pass the context from parameter!
6        Task<LocationSettingsResponse> result =
                LocationServices.getSettingsClient(mContext).checkLocationSettings(builder.build());   // Here comes the usage of the context we passed as parameter!


        result.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
            @Override
            public void onComplete(@NonNull Task<LocationSettingsResponse> task) {

                try {
                    LocationSettingsResponse response = task.getResult(ApiException.class);
                    // All location settings are satisfied. The client can initialize location
                    // requests here.

                    createLocationRequest();        // Start updating location!

                } catch (ApiException exception) {
                    switch (exception.getStatusCode()) {
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            // Location settings are not satisfied. But could be fixed by showing the
                            // user a dialog.
                            try {
                                // Cast to a resolvable exception.
                                ResolvableApiException resolvable = (ResolvableApiException) exception;
                                // Show the dialog by calling startResolutionForResult(),
                                // and check the result in onActivityResult().
                                // MARK: - Here we pass the activity from parameter!
7                               resolvable.startResolutionForResult(
                                        mActivity,
                                        LocationRequest.PRIORITY_HIGH_ACCURACY);  // And here comes the usage for the activity we passed as parameter


                            } catch (IntentSender.SendIntentException e) {
                                // Ignore the error.
                            } catch (ClassCastException e) {
                                // Ignore, should be an impossible error.
                            }
                            break;
                        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                            // Location settings are not satisfied. However, we have no way to fix the
                            // settings so we won't show the dialog.
                            break;
                    }
                }
            }
        });
    }

【讨论】:

  • 这样传递活动可能不是一个好主意
  • @adamyong 你能解释一下原因吗?
猜你喜欢
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 2011-09-09
相关资源
最近更新 更多