“系统服务在 onCreate() 之前对活动不可用”错误消息?
Posted
技术标签:
【中文标题】“系统服务在 onCreate() 之前对活动不可用”错误消息?【英文标题】:"System services not available to Activities before onCreate()" Error message? 【发布时间】:2012-07-23 15:48:48 【问题描述】:当用户在我的应用程序中点击一个图标时,我希望应用程序首先检查设备是否连接到互联网,然后根据它收到的结果执行某些操作(知道它只是弹出一个对话框,通知是否设备是否连接)。所以我写了这段代码:
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 ComponentInfocom.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
为什么会发生这种情况,我该如何解决?我是这方面的新手,所以...请温柔一点! :)
【问题讨论】:
【参考方案1】:我认为这是因为您在创建之前实例化了一个 onClick 侦听器。尝试在 onCreate()
方法中实例化 onClick 监听器。
AlertDialog
也可能是这种情况,也可能不是,但我不完全确定。
从技术上讲,我认为是以下行导致了问题:
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
但是,由于这是在 isNetworkConnected()
方法中调用的,而该方法又在您的 onClick 方法中调用,因此移动 onClick 的实例化可以解决问题。
线索在于异常系统服务在onCreate()之前对Activity不可用
【讨论】:
是的,成功了!我在想问题出在 isNetworkConnected() 方法上……我真傻。非常感谢!我再过 7 分钟都无法点击“接受”按钮,但我会稍后再做!再次,非常感谢! 我刚刚重新编辑了一下,这是导致问题的 isNetworkConnected 方法,正如我在编辑后的答案中所解释的那样。 这对我来说没有任何意义。他没有调用在点击处理程序的onClick()
方法中调用的isNetworkConnected()
。除了点击处理程序之外,还必须调用isNetworkConnected()
。
好吧,我在 onCreate 内的 setOnClickListener 内的 onClick 内有它,但它不起作用。
感谢您的回答。我有一个类似的问题。我需要将一些适配器从最终成员移动到在 onCreate
方法中构造以解决问题。【参考方案2】:
错误是由于创建此对象创建。
AlertDialog.Builder builder = new AlertDialog.Builder(this);
您应该在调用 onCreate 之后执行此操作。
【讨论】:
【参考方案3】:将以下权限添加到 AndroidManifest.xml 文件。
我认为您忘记添加此权限。
android.permission.ACCESS_NETWORK_STATE
它会帮助你。
【讨论】:
【参考方案4】:问题在于您将“侦听器”定义为全局变量。由于它在错误消息中给出:系统服务在 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】:另外,如果有一个内部类,比如 class MyAdapter extends ArrayAdapter<myModel>
或类似的,它有助于 NOT 实例化它 - (MyAdapter = new mAdapter<mModel>()
) 在活动的onCreate()
之前。
【讨论】:
【参考方案6】:正确答案是
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 相同的问题,如果互联网不可用,则显示错误对话框,我的愚蠢错误是
我没有将上下文传递为“this”,而是将其传递为MainActivity()
正确的 R.string.error.errorDialog(this) //
错误的 R.string.error.errorDialog(MainActivity())
【讨论】:
【参考方案7】:要调用系统服务,我们必须使用正在运行的活动。这意味着我们需要执行继承到super
的onCreate
方法。因此要确定我们必须使用当前的应用程序上下文来调用系统服务。
使用
ConnectivityManager cm = (ConnectivityManager) getBaseContext().getSystemService(Context.CONNECTIVITY_SERVICE);
或者如果我们有引用Context
的context
对象,我们可以如下使用它
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
【讨论】:
【参考方案8】:在我的情况下,我收到错误消息:“系统服务在 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)
【讨论】:
以上是关于“系统服务在 onCreate() 之前对活动不可用”错误消息?的主要内容,如果未能解决你的问题,请参考以下文章