互联网连接导致Android应用程序中的空指针异常

问题描述:

我正在设计具有互联网连接的登录屏幕,但是当我运行该代码时,它会引发连接。互联网连接导致Android应用程序中的空指针异常

在广播接收机中使用的连接码

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()抛出错误在onCreate方法调用checkConnection() 方法

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

更改方法用下面的代码。

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

从您提供的背景调用isConnected()方法。希望有所帮助。

+0

没有得到我整个代码 –

+0

@MerkyRobins没有得到什么? –

+0

为什么应用程序在广播接收器中崩溃getApplicationContext() –

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

ConnectivityManager cm = (ConnectivityManager) SpsApplication.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE); 
+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(); } 

在登录活动的另外一个变化。 –

看起来SpsApplication正在给空指针

你应该在应用程序标签

name=".SpsApplication"

+0

没有得到我整个代码 –

试试这个代码希望这将有助于你的清单中添加这:

上的应用类

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

没有得到我整个代码。 –

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

你应该通过Context

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

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

没有得到我把整个代码。 –

这些都是一些修改我提出通过传递上下文refrence

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