Internet 连接导致 Android 应用程序出现空指针异常

Internet connectivity causes Null Pointer Exception in Android application

我正在设计一个具有互联网连接的登录屏幕,但是当我 运行 该代码时它抛出连接。

The connectivity code used in broadcast receiver

 public class ConnectivityReceiver extends BroadcastReceiver {

public static ConnectivityReceiverListener connectivityReceiverListener;

public ConnectivityReceiver() {
    super();
}

@Override
public void onReceive(Context context, Intent intent) {
    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean isConnected = activeNetwork != null
            && activeNetwork.isConnectedOrConnecting();

    if (connectivityReceiverListener != null) {
        connectivityReceiverListener.onNetworkConnectionChanged(isConnected);
    }
}

public static boolean isConnected(){
    ConnectivityManager
            cm = (ConnectivityManager) SpsApplication.getInstance().getApplicationContext()
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return activeNetwork != null
            && activeNetwork.isConnectedOrConnecting();
}

}

At getApplicationContext() throws error Calling checkConnection() method in onCreate method

public class LoginActivity 扩展 AppCompatActivity 实现 ConnectivityReceiverListener{

private EditText mEditEmail;
private EditText mEditPassword;

private Button mButtonLoginSPS;

private LinearLayout linearLayoutLogin;

String emailSPS, passwordSPS;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    //Check Internet Connectivity while loading login screen

    linearLayoutLogin = (LinearLayout) findViewById(R.id.main_login);

    mEditEmail = (EditText) findViewById(R.id.emailEditEmail);
    emailSPS = mEditEmail.getText().toString();


    mButtonLoginSPS = (Button) findViewById(R.id.buttonLoginSPS);
    mButtonLoginSPS.setEnabled(false);

    mEditEmail.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            if (emailSPS.matches(Constant.PATTERN_EMAIL) && s.length() > 0) {
                //mEditEmail.setError("Invalid Email");
                Snackbar.make(linearLayoutLogin, R.string.invalid_email, Snackbar.LENGTH_SHORT).show();
            } else {
                mEditEmail.setError("Valid Email");
            }
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

    mEditPassword = (EditText) findViewById(R.id.emailEditPassword);
    mEditPassword.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            callWebserviceEnabled();
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

}

private void checkConnection() {

    boolean isConnected = ConnectivityReceiver.isConnected();
    showSnack(isConnected);
}

private void showSnack(boolean isConnected) {

    String message;
    int color;
    if (isConnected) {
        message = "Good! You are connected to network";
        color = Color.WHITE;
    } else {
        message = "Oh ! You are not connected. Please check connectivity";
        color = Color.RED;
    }

    Snackbar snackbar = Snackbar.make(linearLayoutLogin, message, Snackbar.LENGTH_SHORT);
    View sbView = snackbar.getView();
    TextView textView = (TextView) sbView.findViewById(android.support.design.R.id.snackbar_text);
    textView.setTextColor(color);
    snackbar.show();
}

private void callWebserviceEnabled() {
    passwordSPS = mEditPassword.getText().toString();
    mButtonLoginSPS.setEnabled(true);

    mButtonLoginSPS.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Check Internet Connectivity while loading login screen
            checkConnection();

            Intent intent = new Intent(LoginActivity.this, MainActivity.class);
            startActivity(intent);
        }
    });
}
@Override
public void onNetworkConnectionChanged(boolean isConnected) {
    showSnack(isConnected);
}

}

SPS应用程序class

    public class SpsApplication extends Application {

    private static SpsApplication mInstance;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    public static synchronized SpsApplication getInstance() {
        return mInstance;
    }

    public void setConnectivityListener(ConnectivityReceiverListener listener) {
       ConnectivityReceiver.connectivityReceiverListener = listener;
    }


}

Here are detailed log of error receive while running application and pressing button

 06-22 14:04:04.443 21986-21986/labs.spoke.com.spokeadmin E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: labs.spoke.com.spokeadmin, PID: 21986
                                                                           java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.ContextWrapper.getApplicationContext()' on a null object reference
                                                                               at labs.spoke.com.spokeadmin.testify.ConnectivityReceiver.isConnected(ConnectivityReceiver.java:32)
                                                                               at labs.spoke.com.spokeadmin.acts.LoginActivity.checkConnection(LoginActivity.java:100)
                                                                               at labs.spoke.com.spokeadmin.acts.LoginActivity.access0(LoginActivity.java:28)
                                                                               at labs.spoke.com.spokeadmin.acts.LoginActivity.onClick(LoginActivity.java:131)
                                                                               at android.view.View.performClick(View.java:5637)
                                                                               at android.view.View$PerformClick.run(View.java:22429)
                                                                               at android.os.Handler.handleCallback(Handler.java:751)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                               at android.os.Looper.loop(Looper.java:154)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
`

If SpsApplication.getInstance() return 应用程序对象则无需调用 getApplicationContext() 方法。删除此方法。

ConnectivityManager cm = (ConnectivityManager) SpsApplication.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);

看起来 SpsApplication 给出了空指针

您应该将其添加到应用程序标签中的清单中

name=".SpsApplication"

Try this code hope this will help:

正在申请 class

public static ApplicationClassName appInstance = null;

@Override
public void onCreate() {
    super.onCreate();

     appInstance = this;

并使用这个 appInstance

   public static boolean isConnectedToInternet() {

      ConnectivityManager connectivity = (ConnectivityManager) ApplicationClassName.appInstance.getSystemService(Context.CONNECTIVITY_SERVICE);
      if (connectivity != null) {
        NetworkInfo info = connectivity.getActiveNetworkInfo();
        if (info != null)
            if (info.getState() == NetworkInfo.State.CONNECTED) {
                return true;
            }
       }
    return false;
   }

Check if internet connectivity is available or not.

 if(isConnectedToInternet()) {

 // network available

 } else{
 // offline
 }

NullPointerException is thrown when an application attempts to use an object reference that has the null value .

你应该通过 Context

Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.

    public static boolean isConnected(Context ctxOBJ)
   {
      ConnectivityManager cm = (ConnectivityManager) ctxOBJ.getSystemService(Context.CONNECTIVITY_SERVICE);
    .......//Add your code........
   }

按照以下代码更改您的方法。

public static boolean isConnected(Context context){
    ConnectivityManager
            cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return activeNetwork != null
            && activeNetwork.isConnectedOrConnecting();
}

提供您正在调用此 isConnected() 方法的上下文。希望对您有所帮助。

这些是我对运行我的代码

所做的一些修改
   public static boolean isConnected(Context context) {
    ConnectivityManager
            cm = (ConnectivityManager) context.getApplicationContext()
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return activeNetwork != null

&& activeNetwork.isConnectedOrConnecting();
}

通过传递上下文引用

登录activity的另一个变化
private void checkConnection() {
    boolean isConnected = ConnectivityReceiver.isConnected(this);
    showSnack(isConnected);
}