当用户点击我的应用程序中的图标时,我希望应用程序首先检查设备是否已连接到互联网,然后根据它收到的结果执行某些操作(因为知道它只是弹出一个对话框,通知设备是否已连接(。所以我写了这段代码:
public class MainActivity extends Activity {
// SOME CONSTANTS WILL BE DEFINED HERE
AlertDialog.Builder builder = new AlertDialog.Builder(this);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.icoMyIcon).setOnClickListener(listener);
}
private OnClickListener listener = new OnClickListener() {
public void onClick(View v) {
if (isNetworkConnected()) {
builder.setMessage("Internet connected!").setCancelable(false)
.setPositiveButton("OK", null);
builder.create().show();
} else {
builder.setMessage("Internet isn't connected!")
.setCancelable(false)
.setPositiveButton("OK", null);
builder.create().show();
}
}
};
// Check if the device is connected to the Internet
private boolean isNetworkConnected() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni == null) {
// There are no active networks.
return false;
} else
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
当我尝试在模拟器上运行此应用程序时,它不断压垮,我在 LogCat 中收到以下错误消息:
07-24 22:59:45.034: E/AndroidRuntime(894): FATAL EXCEPTION: main
07-24 22:59:45.034: E/AndroidRuntime(894): java.lang.RuntimeException: Unable to
instantiate activity ComponentInfo{com.my.app/com.my.app.MainActivity}:
java.lang.IllegalStateException: System services not available to Activities before onCreate()
07-24 22:59:45.034: E/AndroidRuntime(894): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
07-24 22:59:45.034: E/AndroidRuntime(894): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
07-24 22:59:45.034: E/AndroidRuntime(894): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
07-24 22:59:45.034: E/AndroidRuntime(894): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
07-24 22:59:45.034: E/AndroidRuntime(894): at android.os.Handler.dispatchMessage(Handler.java:99)
07-24 22:59:45.034: E/AndroidRuntime(894): at android.os.Looper.loop(Looper.java:123)
07-24 22:59:45.034: E/AndroidRuntime(894): at android.app.ActivityThread.main(ActivityThread.java:4627)
07-24 22:59:45.034: E/AndroidRuntime(894): at java.lang.reflect.Method.invokeNative(Native Method)
07-24 22:59:45.034: E/AndroidRuntime(894): at java.lang.reflect.Method.invoke(Method.java:521)
07-24 22:59:45.034: E/AndroidRuntime(894): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-24 22:59:45.034: E/AndroidRuntime(894): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-24 22:59:45.034: E/AndroidRuntime(894): at dalvik.system.NativeStart.main(Native Method)
07-24 22:59:45.034: E/AndroidRuntime(894): Caused by: java.lang.IllegalStateException: System services not available to Activities before onCreate()
07-24 22:59:45.034: E/AndroidRuntime(894): at android.app.Activity.getSystemService(Activity.java:3526)
07-24 22:59:45.034: E/AndroidRuntime(894): at com.android.internal.app.AlertController$AlertParams.<init>(AlertController.java:743)
07-24 22:59:45.034: E/AndroidRuntime(894): at android.app.AlertDialog$Builder.<init>(AlertDialog.java:273)
07-24 22:59:45.034: E/AndroidRuntime(894): at com.my.app.MainActivity.<init>(MainActivity.java:24)
07-24 22:59:45.034: E/AndroidRuntime(894): at java.lang.Class.newInstanceImpl(Native Method)
07-24 22:59:45.034: E/AndroidRuntime(894): at java.lang.Class.newInstance(Class.java:1429)
07-24 22:59:45.034: E/AndroidRuntime(894): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
07-24 22:59:45.034: E/AndroidRuntime(894): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
07-24 22:59:45.034: E/AndroidRuntime(894): ... 11 more
为什么会发生这种情况,我该如何解决?我是这方面的新手,所以...请温柔一点!:)
这是因为您在创建之前实例化onClick侦听器被调用。尝试在 onCreate()
方法中实例化 onClick 侦听器。
AlertDialog
也可能是这种情况,但我不完全确定。
从技术上讲,我认为是以下行导致了问题:
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
但是,由于这是在 isNetworkConnected()
方法中调用的,而 方法又在 onClick 方法中调用,因此移动 onClick 的实例化可以解决此问题。
线索在异常系统服务不可用之前的活动创建((
错误是由于创建此对象。
AlertDialog.Builder builder = new AlertDialog.Builder(this);
您应该在调用 onCreate 后执行此操作。
要调用系统服务,我们必须使用正在运行的活动。这意味着我们需要执行继承到super
onCreate
方法。所以要识别我们必须使用当前的应用程序上下文来调用系统服务。
用
ConnectivityManager cm = (ConnectivityManager) getBaseContext().getSystemService(Context.CONNECTIVITY_SERVICE);
或者如果我们有context
对象 引用Context
,我们可以按如下方式使用它
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
正确答案是
AlertDialog.Builder builder = new AlertDialog.Builder(this);
Jeet已经提到过,原因是您在使用逻辑不正确的活动上下文执行活动的任何生命周期方法之前AlertDialog
初始化。
您的问题的解决方案是:
private OnClickListener listener = new OnClickListener() {
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
if (isNetworkConnected()) {
builder.setMessage("Internet connected!").setCancelable(false)
.setPositiveButton("OK", null);
builder.create().show();
} else {
builder.setMessage("Internet isn't connected!")
.setCancelable(false)
.setPositiveButton("OK", null);
builder.create().show();
}
}
};
初始化警报对话框,当它需要可见时。发布这个旧线程答案的原因是公认的答案,即使您将onclick侦听器移出onCreate()
Jeet的答案也没有解决问题,问题仍然是相同的。
今天我在 kotlin 上遇到了同样的问题,如果互联网不可用,则显示错误对话框,我的愚蠢错误是
我没有将上下文传递为"这个",而是将其传递为MainActivity()
Correct R.string.error.errorDialog(this(//
Wrong R.string.error.errorDialog(MainActivity(((
问题是您将"侦听器"定义为全局变量。因为它在错误消息中给出:系统服务不适用于 onCreate(( 之前的活动。
您的onCreate方法应如下所示:
private OnClickListener listener = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listener = new OnClickListener() {
public void onClick(View v) {
if (isNetworkConnected()) {
builder.setMessage("Internet connected!").setCancelable(false)
.setPositiveButton("OK", null);
builder.create().show();
} else {
builder.setMessage("Internet isn't connected!")
.setCancelable(false)
.setPositiveButton("OK", null);
builder.create().show();
}
}
};
findViewById(R.id.icoMyIcon).setOnClickListener(listener);
}
将以下权限添加到 AndroidManifest.xml 文件中。
我想你忘了添加这个权限。
android.permission.ACCESS_NETWORK_STATE
它会帮助你。
此外,如果有一个内部类,比如class MyAdapter extends ArrayAdapter<myModel>
或类似的,则在活动onCreate()
之前不要实例化它 - ( MyAdapter = new mAdapter<mModel>()
(。
情况下,我收到错误消息:"系统服务不适用于onCreate((之前的活动"
当我使用如下所示的上下文初始化类属性时
class MainActivity : AppCompatActivity() {
// this line below
private val notificationManager: NotificationManagerCompat = NotificationManagerCompat.from(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}