我正在设计一个具有互联网连接的登录屏幕,但是当我运行该代码时,它会抛出连接。
广播接收器中使用的连接代码
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)
`
答案 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);
}