"Servicios del sistema no disponibles para Actividades antes de onCreate ()" ¿Mensaje de error?

Cuando el usuario accede a un icono de mi aplicación, quiero que la aplicación compruebe primero si el dispositivo está conectado a Internet y, a continuación, haga algo dependiendo del resultado que recibe (para saber si aparece un cuadro de diálogo informando si el dispositivo está Conectados o no). Así que escribí este código:

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; } } 

Cuando estoy tratando de ejecutar esta aplicación en el emulador que sigue aplastando y estoy recibiendo mensajes de error en 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 

¿Por qué está sucediendo y cómo lo arreglo? Soy un novato en esto, así que … por favor sea gentil! 🙂

Creo que es porque su instanciar un oyente onClick antes de crear se llama. Pruebe instanciar el oyente onClick dentro del método onCreate() .

Esto puede o no ser el caso con el AlertDialog también, pero no estoy completamente seguro.

Técnicamente creo que es la siguiente línea que causa el problema:

 ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

Sin embargo, debido a que se está llamando dentro del método isNetworkConnected() que a su vez se llama dentro de su método onClick, mover la instancia de onClick corrige el problema.

La clave está en la excepción Los servicios del sistema no están disponibles para Actividades antes onCreate ()

Se ha producido un error al crear esta creación de objeto.

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

Debe hacer esto después de que onCreate se haya invocado.

El problema es que define "escucha" como una variable global. Dado que aparece en el mensaje de error: Servicios del sistema no disponibles para Actividades antes onCreate ().

Su método onCreate debe ser así:

 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); } 

Agregue el siguiente permiso al archivo AndroidManifest.xml .

Creo que se le olvida agregar este permiso.

 android.permission.ACCESS_NETWORK_STATE 

Esto te ayudará.

Además, si hay una clase interna, digamos que la class MyAdapter extends ArrayAdapter<myModel> o similar, ayuda NO instanciarla – ( MyAdapter = new mAdapter<mModel>() ) antes de la actividad onCreate() .

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.