Android &引用;onCreate()之前的活动无法使用系统服务;错误消息?

Android &引用;onCreate()之前的活动无法使用系统服务;错误消息?,android,methods,oncreate,Android,Methods,Oncreate,当用户点击我的应用程序中的图标时,我希望应用程序首先检查设备是否已连接到互联网,然后根据收到的结果执行操作(例如,它只是弹出一个对话框,通知设备是否已连接)。所以我写了这段代码: public class MainActivity extends Activity { // SOME CONSTANTS WILL BE DEFINED HERE AlertDialog.Builder builder = new AlertDialog.Builder(this); @Override pu

当用户点击我的应用程序中的图标时,我希望应用程序首先检查设备是否已连接到互联网,然后根据收到的结果执行操作(例如,它只是弹出一个对话框,通知设备是否已连接)。所以我写了这段代码:

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
07-2422:59:45.034:E/AndroidRuntime(894):致命异常:主
07-24 22:59:45.034:E/AndroidRuntime(894):java.lang.RuntimeException:无法
实例化活动组件信息{com.my.app/com.my.app.MainActivity}:
java.lang.IllegalStateException:onCreate()之前的活动无法使用系统服务
07-24 22:59:45.034:E/AndroidRuntime(894):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
07-24 22:59:45.034:E/AndroidRuntime(894):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
07-24 22:59:45.034:E/AndroidRuntime(894):在android.app.ActivityThread.access$2300(ActivityThread.java:125)
07-24 22:59:45.034:E/AndroidRuntime(894):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
07-24 22:59:45.034:E/AndroidRuntime(894):在android.os.Handler.dispatchMessage(Handler.java:99)上
07-24 22:59:45.034:E/AndroidRuntime(894):在android.os.Looper.loop(Looper.java:123)上
07-24 22:59:45.034:E/AndroidRuntime(894):位于android.app.ActivityThread.main(ActivityThread.java:4627)
07-24 22:59:45.034:E/AndroidRuntime(894):位于java.lang.reflect.Method.Invokenactive(本机方法)
07-24 22:59:45.034:E/AndroidRuntime(894):位于java.lang.reflect.Method.invoke(Method.java:521)
07-24 22:59:45.034:E/AndroidRuntime(894):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-24 22:59:45.034:E/AndroidRuntime(894):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-24 22:59:45.034:E/AndroidRuntime(894):在dalvik.system.NativeStart.main(本机方法)
07-24 22:59:45.034:E/AndroidRuntime(894):原因:java.lang.IllegalStateException:onCreate()之前的活动无法使用系统服务
07-24 22:59:45.034:E/AndroidRuntime(894):位于android.app.Activity.getSystemService(Activity.java:3526)
07-24 22:59:45.034:E/AndroidRuntime(894):位于com.android.internal.app.AlertController$AlertParams。(AlertController.java:743)
07-24 22:59:45.034:E/AndroidRuntime(894):在android.app.AlertDialog$Builder上。(AlertDialog.java:273)
07-24 22:59:45.034:E/AndroidRuntime(894):位于com.my.app.MainActivity。(MainActivity.java:24)
07-24 22:59:45.034:E/AndroidRuntime(894):位于java.lang.Class.newInstanceImpl(本机方法)
07-24 22:59:45.034:E/AndroidRuntime(894):位于java.lang.Class.newInstance(Class.java:1429)
07-24 22:59:45.034:E/AndroidRuntime(894):在android.app.Instrumentation.newActivity(Instrumentation.java:1021)上
07-24 22:59:45.034:E/AndroidRuntime(894):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
7-2422:59:45.034:E/安德鲁迪伦时间(894):。。。还有11个

为什么会发生这种情况?我该如何解决?我是个新手,所以。。。请温柔点!:)

我认为这是因为在创建之前实例化onClick侦听器被调用。尝试在
onCreate()方法中实例化onClick侦听器

AlertDialog
也可能是这样,也可能不是这样,但我不能完全确定

从技术上讲,我认为是以下几行造成了问题:

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
但是,由于这是在
isNetworkConnected()
方法中调用的,而该方法又在onClick方法中调用,因此移动onClick的实例化可以解决问题


线索在异常中系统服务不可用于onCreate()之前的活动

错误是由于创建此对象

AlertDialog.Builder builder = new AlertDialog.Builder(this);

您应该在调用onCreate后执行此操作。

向AndroidManifest.xml文件添加以下权限

我想你忘了添加此权限

android.permission.ACCESS_NETWORK_STATE

它会帮助你的

问题在于您将“listener”定义为一个全局变量。因为它是在错误消息中给出的: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);

}

另外,如果有一个内部类,比如说
类MyAdapter Extendes ArrayAdapter
或类似的类,那么在
活动的
onCreate()
之前对它进行实例化(
MyAdapter=new mAdapter()
是有帮助的

jeet已经提到了这一点,原因是在使用逻辑上不正确的活动上下文执行活动的任何生命周期方法之前,您已经初始化了
AlertDialog

您的问题的解决方案是:

private OnClickListener=new OnClickListener(){
公共void onClick(视图v){
AlertDialog.Builder=新建AlertDialog.Builder(此);
如果(isNetworkConnected()){
builder.setMessage(“已连接Internet!”).setCancelable(false)
.setPositiveButton(“确定”,空);
builder.create().show();
}否则{
setMessage(“Internet未连接!”)
.setCancelable(错误)
.setPositiveButton(“确定”,空);
builder.create().show();
}
}
};
在需要显示警报对话框时初始化该对话框。 将答案发布到此旧线程背后的原因是已接受的答案,即使您将onclick侦听器移出
onCreate()

今天我遇到了和kotlin相同的问题,如果互联网不可用,那么显示错误对话框,我愚蠢的错误是

而不是将上下文作为“this”传递
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
ConnectivityManager cm = (ConnectivityManager) getBaseContext().getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
 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)
        }

    }