互联网连接导致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()方法。希望有所帮助。
如果SpsApplication.getInstance()返回应用程序对象,则不需要调用getApplicationContext()方法。删除这个方法。
ConnectivityManager cm = (ConnectivityManager) SpsApplication.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
没有得到我把整个代码运行我的代码
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"
没有得到我整个代码 –
上的应用类试试这个代码希望这将有助于你的清单中添加这:
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;
}
没有得到我整个代码。 –
的NullPointerException当应用程序试图使用具有空值的 对象引用被抛出。
你应该通过Context
接口有关的应用程序环境的全局信息。这个 是一个抽象类,其实现由Android 系统提供。它允许访问特定应用的资源和 类,以及向上调用应用程序级的操作,如 开展活动,广播和接收意图等
public static boolean isConnected(Context ctxOBJ)
{
ConnectivityManager cm = (ConnectivityManager) ctxOBJ.getSystemService(Context.CONNECTIVITY_SERVICE);
.......//Add your code........
}
提到
没有得到我把整个代码。 –
这些都是一些修改我提出通过传递上下文refrence
private void checkConnection() {
boolean isConnected = ConnectivityReceiver.isConnected(this);
showSnack(isConnected);
}
没有得到我整个代码 –
@MerkyRobins没有得到什么? –
为什么应用程序在广播接收器中崩溃getApplicationContext() –