"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:
- ¿Cómo cambio entre el GPS y el proveedor de la red?
- Lista de lecturas <Item> con retrofit de XML API
- Android Fused Location API - cómo utilizar PRIORITY_BALANCED_POWER_ACCURACY y PRIORITY_HIGH_ACCURACY en una aplicación?
- Generar errores con XML a la dependencia del convertidor de objetos de java en build.gradle para retroadaptación
- ¿por qué se muestra el mensaje no registrado de la aplicación de Android al iniciar sesión con gmail en la aplicación android?
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! 🙂
- ¿Utilizando appMobi puedo crear aplicaciones para Android y aplicaciones para iPhone de forma gratuita (además de los costos de Google / Apple)?
- ¿Cómo publicar una solicitud de HTTPS utilizando Retrofit?
- Implicaciones de la compatibilidad con varios usuarios de Android (nueva en 4.2) para el modelo de datos del lado del servidor (por ejemplo, android_id)
- Parametrización de Android @Headers
- Detección de presencia de FPU en Android
- El éxito de Retrofit.Callback () y el fallo () en caso de dos implementaciones de interfaz en la misma Actividad
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()
.