2012-07-25 12 views
9

Gdy użytkownik kliknie ikonę w mojej aplikacji, najpierw chcę ją sprawdzić, czy urządzenie jest podłączone do Internetu, a następnie zrobić coś w zależności od wyniku, jaki otrzyma (wiadomo, że po prostu pojawiło się okno dialogowe, informując, czy urządzenie jest podłączone lub nie). Więc napisałem ten kod:"Usługi systemowe niedostępne dla działań przed onCreate()" Komunikat o błędzie?

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

} 

Kiedy próbuję uruchomić aplikację w emulatorze Utrzymuje kruszenia a ja otrzymuję ten komunikaty o błędach w 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 

Dlaczego tak się dzieje i jak to naprawić? Jestem nowicjuszem, więc ... proszę, bądź łagodny! :)

Odpowiedz

13

Myślę, że dzieje się tak dlatego, że wywoływana jest sesja onClick przed utworzeniem. Spróbuj utworzyć instancję detektora onClick w metodzie onCreate().

To może ale nie musi być w przypadku AlertDialog, ale nie jestem do końca pewien.

Technicznie uważam, że jest następujący wiersz, który powoduje problem:

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

Jednakże, ponieważ ten jest nazywany w metodzie isNetworkConnected() który z kolei jest nazywany w swoim sposobie onClick, przesuwając konkretyzacji onClick rozwiązuje problem.

Wskazówkę jest w usługach wyjątek systemowe niedostępnych Działania przed onCreate()

+0

tak, to załatwiło sprawę! I myślałem, że problem jest z metodą isNetworkConnected() ... Silly me. Dziękuję Ci bardzo! Nie mogę nacisnąć przycisku "Akceptuj" przez kolejne 7 minut, ale zrobię to później! Jeszcze raz bardzo dziękuję! – Igal

+0

Ive just reedited slightly, jest to metoda isNetworkConnected, która powoduje problem, jak wyjaśniono w mojej edytowanej odpowiedzi. –

+1

To nie ma dla mnie żadnego sensu. Nie wywołuje metody 'isNetworkConnected()', która jest wywoływana w metodzie 'onClick()' metody obsługi kliknięcia. Coś innego musi wywoływać 'isNetworkConnected()' oprócz obsługi kliknięcia. –

8

Błąd jest wynikiem tworzenia tego tworzenie obiektów.

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

powinieneś zrobić to po wywołaniu polecenia onCreate.

+0

Tak, to był problem z moim kodem! Dziękuję Ci bardzo! – Igal

0

dodać następujące pozwolenie do pliku AndroidManifest.xml.

Myślę, że zapomniałeś dodać to pozwolenie.

android.permission.ACCESS_NETWORK_STATE 

to ci pomoże.

0

Problem polega na tym, że definiujesz "słuchacza" jako zmienną globalną. Ponieważ jest podana w komunikacie o błędzie: Usługi systemowe niedostępne dla działań przed onCreate().

Twoja metoda onCreate powinno być tak:

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

Ponadto, jeśli istnieje wewnętrzna klasy, powiedzmy class MyAdapter extends ArrayAdapter<myModel> lub podobny, pomaga NIE do jego instancję - (MyAdapter = new mAdapter<mModel>()) przed aktywność: onCreate().

0

Poprawna odpowiedź brzmi

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

który jest już wymieniona przez Jeet i rozumu jest już zainicjowany AlertDialog przed każdym cyklem aktywności metody zawartej z kontekstu działalności, która nie jest logicznie poprawne.

A rozwiązanie problemu jest

prywatny OnClickListener słuchacz = 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(); 
    } 

} 

};

Inicjuj okno dialogowe alertu, gdy jest ono widoczne. Powodem umieszczenia odpowiedzi na to stare wątku jest zaakceptowana odpowiedź, a odpowiedź Jeet nie rozwiązała problemu, nawet jeśli przeniesiesz swojego słuchacza onclick z onCreate() nadal będzie to samo.

Dzisiaj natknąłem się na tym samym numerze z Kotlin gdzie jeśli internet nie availbe następnie wyświetlić komunikat o błędzie i mój głupi błąd był

zamiast przekazywać kontekst jak „to” Minąłem ją jako główną działalność()

Prawidłowe R.string.error.errorDialog (this) //

Niewłaściwy R.string.error.errorDialog (główną działalność())

Powiązane problemy