【问题标题】:Internet connectivity causes Null Pointer Exception in Android applicationInternet 连接导致 Android 应用程序中出现空指针异常
【发布时间】:2017-06-22 07:29:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: android android-activity connection


    【解决方案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() 方法时提供上下文。希望对您有所帮助。

    【讨论】:

    • 为什么应用程序由于广播接收器中的 getApplicationContext() 而崩溃
    【解决方案2】:

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

    你应该通过Context

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

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

    【讨论】:

      【解决方案3】:

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

      关于应用类

      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
       }
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          看起来SpsApplication 正在提供空指针

          您应该在应用程序标签的清单中添加它

          name=".SpsApplication"

          【讨论】:

            【解决方案6】:

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

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

            通过传递上下文引用对登录活动的另一个变化

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

            【讨论】:

              猜你喜欢
              • 2015-09-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-09-28
              • 1970-01-01
              • 2014-04-02
              相关资源
              最近更新 更多