2012-07-25 25 views
9

Cuando el usuario toca un ícono en mi aplicación, primero quiero que la aplicación compruebe si el dispositivo está conectado a Internet y luego hacer algo dependiendo del resultado que reciba (para saber es solo abrir un cuadro de diálogo, informando si el dispositivo está conectado o no). Así que escribí este código:"Los servicios del sistema no están disponibles para actividades antes de onCreate()" ¿Mensaje de error?

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 se mantiene al tanto de trituración y estoy recibiendo este mensaje 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 como lo arreglo? Soy un novato en esto, así que ... ¡por favor sea gentil! :)

Respuesta

13

Creo que es porque se llama a su instancia de un oyente onClick antes de crear. Intente crear una instancia del oyente OnClick dentro del método onCreate().

Esto puede o no ser el caso con el AlertDialog también, pero no estoy del todo 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 esto se llama en el método isNetworkConnected() que a su vez se llama dentro de su método onclick, moviendo la creación de instancias de la onClick corrige el problema.

La idea es en los servicios del sistema excepción no están disponibles para las actividades antes onCreate()

+0

sí, eso hizo el truco! Y estaba pensando que el problema es con el método isNetworkConnected() ... Tonto. ¡Muchas gracias! No puedo presionar el botón "Aceptar" durante otros 7 minutos, ¡pero lo haré más tarde! ¡De nuevo muchas gracias! – Igal

+0

He reeditado ligeramente, es el método isNetworkConnected el que causa el problema, como explico en mi respuesta editada. –

+1

Esto no tiene ningún sentido para mí. No llama a 'isNetworkConnected()' que se llama en el método 'onClick()' del manejador de clics. Algo más debe estar llamando 'isNetworkConnected()' además del manejador de clics. –

8

error es debido para crear esta creación de objetos.

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

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

+0

¡Sí, ese era el problema con mi código! ¡Muchas gracias! – Igal

0

agregue el siguiente permiso al archivo AndroidManifest.xml.

Creo que se olvida de agregar este permiso.

android.permission.ACCESS_NETWORK_STATE 

le ayudará.

0

El problema es que define "oyente" como una variable global. Dado que aparece en el mensaje de error: Los servicios del sistema no están disponibles para Actividades antes de onCreate().

Su método onCreate debería 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); 

} 
0

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

0

La respuesta correcta es

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

que ya se menciona por jeet y la razón es que hay inicializado AlertDialog antes de cualquier método de ciclo de vida de la actividad ejecutada con el contexto de la actividad que, lógicamente, no es correcto.

y la solución a su problema es

escucha privada OnClickListener = 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(); 
    } 

} 

};

Inicialice el cuadro de diálogo de alerta cuando sea necesario. La razón detrás de la publicación de la respuesta a este hilo antiguo es la respuesta aceptada y la respuesta de Jeet no resolvió el problema, incluso si mueve su oyente onclick fuera de onCreate(), el problema seguirá siendo el mismo.

Hoy me encontré mismo problema con Kotlin donde si Internet no availbe luego mostrar diálogo de error y mi error tonto era

en lugar de pasar contexto como "este" yo se lo pasó tan MainActivity()

correcta R.string.error.errorDialog (este) //

incorrecto R.string.error.errorDialog (MainActivity())

Cuestiones relacionadas