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

时间:2017-06-22 07:29:38

标签: android android-activity connection

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

  

广播接收器中使用的连接代码

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

}

  

getApplicationContext()投掷错误时调用checkConnection()   onCreate方法中的方法

公共类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);
}

}

SPSApplication类

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


}
  

以下是运行应用程序并按下按钮

时收到错误的详细日志
 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.access$300(LoginActivity.java:28)
                                                                               at labs.spoke.com.spokeadmin.acts.LoginActivity$3.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)
`

6 个答案:

答案 0 :(得分:1)

  
    

试试这段代码希望这会有所帮助:

  

在应用程序类

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

检查互联网连接是否可用。

  
 if(isConnectedToInternet()) {

 // network available

 } else{
 // offline
 }

答案 1 :(得分:1)

  

当应用程序尝试使用时抛出NullPointerException   具有空值的对象引用。

您应该通过 Context

  

有关应用程序环境的全局信息的接口。这个   是一个抽象类,其实现由Android提供   系统。它允许访问特定于应用程序的资源和   类,以及应用程序级操作的上调,如   发起活动,广播和接收意图等。

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

答案 2 :(得分:1)

使用以下代码更改您的方法。

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

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

答案 3 :(得分:0)

如果SpsApplication.getInstance()返回应用程序对象,则无需调用getApplicationContext()方法。删除此方法。

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

答案 4 :(得分:0)

看起来SpsApplication正在给出nullpointer

您应该在应用程序标记

中的清单中添加它

name=".SpsApplication"

答案 5 :(得分:0)

这些是我为运行代码而做的一些修改

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

&& activeNetwork.isConnectedOrConnecting();
}

通过传递上下文引用的另一个Login活动更改

private void checkConnection() {
    boolean isConnected = ConnectivityReceiver.isConnected(this);
    showSnack(isConnected);
}