当用户点击我的应用中的图标时,我希望该应用首先检查设备是否已连接到互联网,然后根据收到的结果执行某些操作(因为知道它只是弹出一个对话框,告知是否设备是否连接)。所以我写了这段代码:
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
为什么会发生这种情况?如何解决?我是新手,所以......请温柔! :)
答案 0 :(得分:14)
我认为这是因为您在创建之前实例化了一个onClick侦听器。尝试在onCreate()
方法中实例化onClick侦听器。
这可能也可能不是AlertDialog
的情况,但我不完全确定。
从技术上讲,我认为导致问题的是以下行:
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
但是,因为这是在isNetworkConnected()
方法中调用的,而{{1}}方法又是在onClick方法中调用的,所以移动onClick的实例化可以解决问题。
线索是例外在onCreate()
之前,活动无法使用的系统服务答案 1 :(得分:9)
错误是由于创建了这个对象。
AlertDialog.Builder builder = new AlertDialog.Builder(this);
你应该在调用onCreate后执行此操作。
答案 2 :(得分:1)
要调用系统服务,我们必须使用运行活动。这意味着我们需要执行继承到onCreate
的{{1}}方法。因此,为了确定我们必须使用当前的应用程序上下文来调用系统服务。
使用
super
或者如果我们有引用ConnectivityManager cm = (ConnectivityManager) getBaseContext().getSystemService(Context.CONNECTIVITY_SERVICE);
的{{1}}对象,我们可以如下使用它
context
答案 3 :(得分:0)
将以下权限添加到 AndroidManifest.xml 文件。
我想你忘了添加这个权限。
android.permission.ACCESS_NETWORK_STATE
它会帮助你。
答案 4 :(得分:0)
问题是你定义了&#34;听众&#34;作为全球变量。由于它在错误消息中给出: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);
}
答案 5 :(得分:0)
另外,如果有一个内部类,比如说class MyAdapter extends ArrayAdapter<myModel>
或类似,它可以帮助 NOT 来实例化它 - (MyAdapter = new mAdapter<mModel>()
) 之前 活动的onCreate()
。
答案 6 :(得分:0)
正确答案是
AlertDialog.Builder builder = new AlertDialog.Builder(this);
已经被jeet提到并且原因是你在使用在逻辑上不正确的Activity上下文执行的任何生命周期活动方法之前初始化了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相同的问题,如果互联网不能用,那么显示错误对话框,我的愚蠢错误是
而不是将上下文传递给&#34;这个&#34;我把它作为MainActivity()
传递给我更正R.string.error.errorDialog(this)//
错误的R.string.error.errorDialog(MainActivity())
答案 7 :(得分:0)
就我而言,我收到错误消息:“ onCreate()之前,Activities无法使用系统服务”
当我使用下面的上下文初始化类属性时
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)
}
}