2012-07-25 7 views
9

Quando l'utente preme un'icona nella mia app, voglio che l'app prima verifichi se il dispositivo è connesso a Internet e poi fa qualcosa in base al risultato che riceve (per sapere che sta spuntando una finestra di dialogo, informando se il il dispositivo è collegato o meno). Così ho scritto questo codice:"Servizi di sistema non disponibili per Attività prima onCreate()" Messaggio di errore?

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

} 

Quando sto cercando di eseguire questa applicazione sull'emulatore si continua frantumazione e sto ottenendo questo messaggi di errore in 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 

Perché sta accadendo e come lo aggiusto? Sono un novizio in questo, quindi ... per favore sii gentile! :)

risposta

13

Penso che sia perché viene chiamato il tuo istanziamento di un ascoltatore onClick prima di creare. Prova a istanziare il listener onClick all'interno del metodo onCreate().

Questo può o non può essere il caso con lo AlertDialog, ma non ne sono del tutto sicuro.

Tecnicamente credo che sia la seguente riga che causa il problema:

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

Tuttavia, poiché questo viene chiamato all'interno del metodo isNetworkConnected() che a sua volta è chiamato all'interno del vostro metodo onClick, spostando l'istanza del onClick risolve il problema.

L'indizio è nel settore dei servizi di sistema eccezione non disponibili per le attività prima di onCreate()

+0

Yep, che ha fatto il trucco! E stavo pensando che il problema è con il metodo isNetworkConnected() ... Silly me. Grazie mille! Non riesco a premere il pulsante "Accetta" per altri 7 minuti, ma lo farò dopo! Ancora una volta, grazie mille! – Igal

+0

Sono appena stato riarmato leggermente, è il metodo isNetworkConnected che causa il problema, come spiego nella mia risposta modificata. –

+1

Questo non ha alcun senso per me. Non sta chiamando 'isNetworkConnected()' che viene chiamato nel metodo 'onClick()' del gestore di clic. Qualcos'altro deve chiamare 'isNetworkConnected()' oltre al gestore dei clic. –

8

errore è dovuto per creare questa creazione di oggetti.

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

si dovrebbe fare dopo onCreate è stato richiamato.

+0

Sì, questo era il problema con il mio codice! Grazie mille! – Igal

0

aggiungere la seguente autorizzazione al file AndroidManifest.xml.

Penso che tu abbia dimenticato di aggiungere questa autorizzazione.

android.permission.ACCESS_NETWORK_STATE 

ti aiuterà.

0

Il problema è che si definisce "listener" come variabile globale. Poiché è indicato nel messaggio di errore: Servizi di sistema non disponibili per Attività prima di onCreate().

Il tuo metodo onCreate dovrebbe essere simile a questo:

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

Inoltre, se c'è una classe interna, dire class MyAdapter extends ArrayAdapter<myModel> o simili, aiuta NON di creare un'istanza di esso - (MyAdapter = new mAdapter<mModel>()) prima l'attività onCreate().

0

risposta corretta è

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

che è già menzionata da jeet e la ragione è che avete inizializzato AlertDialog prima di qualsiasi metodo del ciclo di vita delle attività eseguite con il contesto di attività che non è logicamente corretto.

e la soluzione al vostro problema è

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

} 

};

Inizializzare finestra di avviso quando si ha bisogno di visibile. motivo dietro la pubblicazione risposta a questo vecchio thread è la risposta accettata e la risposta di Jeet non ha risolto il problema, anche se si sposta il vostro ascoltatore onclick di onCreate() ancora questione sarà lo stesso.

Oggi mi sono imbattuto stesso problema con Kotlin dove se internet non availbe poi mostrare finestra di errore e il mio stupido errore è stato

invece di passare contesto come "questo" ho passato come MainActivity()

corretta R.string.error.errorDialog (questo) //

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

Problemi correlati