“在onCreate()之前,活动无法使用系统服务”错误消息?

时间:2012-07-25 08:45:36

标签: android methods oncreate

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

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

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

8 个答案:

答案 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)
        }

    }