2012-01-03 12 views
7

Próbuję następujący fragment kodu, w którym usługa jest wdrożenie mojego słuchacza:Null Pointer w getApplicationContext()

public class MyListenerClass extends Service implements MyListenerInterface { 
    public void onCurrencyRecieved(MyEventClass event) { 
     System.out.println("Coins Recieved - Listener Successful"); 
     stopSelf(); 
     Toast toast = Toast.makeText(getApplicationContext(), "Service Stopped", Toast.LENGTH_LONG); 
     toast.show();   
    } 

    @Override 
    public void onCreate() { 
     Toast toast = Toast.makeText(getApplicationContext(),"Service started", Toast.LENGTH_LONG); 
     toast.show(); 
     super.onCreate(); 
    } 

Teraz tosty wewnątrz onCreate() działa bez zarzutu, ale wewnątrz Zastąpiona metoda rzuca następujący wyjątek:

01-03 18:52:35.740: ERROR/AndroidRuntime(2388): java.lang.NullPointerException 
01-03 18:52:35.740: ERROR/AndroidRuntime(2388):  at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:100) 
01-03 18:52:35.740: ERROR/AndroidRuntime(2388):  at com.test.listenertest1.MyListenerClass.onCurrencyRecieved(MyListenerClass.java:28) 
01-03 18:52:35.740: ERROR/AndroidRuntime(2388):  at com.test.listenertest1.MyEventGenerator.generateEvent(MyEventGenerator.java:34) 
01-03 18:52:35.740: ERROR/AndroidRuntime(2388):  at com.test.listenertest1.MyEventGenerator.<init>(MyEventGenerator.java:16) 
01-03 18:52:35.740: ERROR/AndroidRuntime(2388):  at com.test.listenertest1.NewActivity.onKeyDown(NewActivity.java:33) 
01-03 18:52:35.740: ERROR/AndroidRuntime(2388):  at android.view.KeyEvent.dispatch(KeyEvent.java:1037) 
01-03 18:52:35.740: ERROR/AndroidRuntime(2388):  at android.app.Activity.dispatchKeyEvent(Activity.java:2046) 
01-03 18:52:35.740: ERROR/AndroidRuntime(2388):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1631) 
01-03 18:52:35.740: ERROR/AndroidRuntime(2388):  at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2368) 
01-03 18:52:35.740: ERROR/AndroidRuntime(2388):  at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2338) 
01-03 18:52:35.740: ERROR/AndroidRuntime(2388):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1641) 
01-03 18:52:35.740: ERROR/AndroidRuntime(2388):  at android.os.Handler.dispatchMessage(Handler.java:99) 

Chyba brakuje mi ważnej koncepcji java. Czy możemy użyć metody getApplicationContext() w nadpisanej metodzie?

+0

Zgodnie z instrukcją (http://developer.android.com/reference/android/app/Service.html) powinieneś być w stanie to zrobić. Co jest w środku 'stopSelf()'? – Asahi

+0

Nic nie jest wewnątrz stopself(). Usługa działa do momentu, gdy stopself() nazywane jest –

Odpowiedz

0

Nie jestem pewien, czy możesz, ponieważ wygląda na to, że znajdujesz się w usłudze, ale jeśli działa w onCreate (i ta ścieżka kodowa jest rzeczywiście wywoływana), możesz łatwo zapisać kontekst do zmiennej lokalnej w onCreate, a następnie później użyć w twojej metodzie.

+0

Inside onCreate() Próbowałem tego: mContext = MyListenerClass.this; , a następnie użyłem mCOntext w mojej przesłoniętej metodzie. Nadal się zawiesza –

7

Należy unikać używania jak największej liczby getApplicationContext(), ponieważ znacznie zwiększy to szansę na uzyskanie zamknięcia Mocy.

Zamiast tego użyj YourClass.this, w tym przypadku MyListenerClass.this.

Chyba w tym przypadku to nie działa, ponieważ getApplicationContext() nazywa postopSelf()

+3

Dlaczego wywoływanie 'getApplicationContext()' zwiększa szansę na uzyskanie Force Close? –

+0

Na przykład, jeśli wywołasz go w przesłoniętej metodzie OnClick, może - w zależności od urządzenia/firmware/sdk - awarię. Lub zobacz powyższy kod: jeśli 'this' był używany, to nie wyrzuciłoby wyjątku. – Force

+0

Próbowałem używać MyListenerClass.this, a nawet usunięto stopself(). Nadal się zawiesza, podając ten sam dziennik. Co więcej, nie widziałem niczego w dziennikach, co sugeruje, że jest to awaria oprogramowania układowego. –

0

Grzanki mogą być dodawane tylko do działalności jak kontekście.

-1

Musisz stworzyć kontekst dla aktywności i przekazać ten kontekst.

public static void pushList(Activity context){ 
    static Context = mConext; 

    protected void onPostExecute(String result) { 

      Toast toast=Toast.makeText(mConext,"Succefully Updated Profile",Toast.LENGTH_LONG); 
       toast.show(); 

    } 
} 

to naprawdę działa dla mnie.

0

Czy ogłosił go jako nowego procesu, w tym przypadku można uzyskać wskaźnik NULL wyjątek

android:process=":MyListenerClass" 

kontekst procesu getApplicationContext() nie będzie działać.

Możesz to sprawdzić, sprawdzając logcat, czy TID i PID Ciebie Aktywność i obsługa są takie same.

0

Spróbuj dać MyListenerClass.this lub YourActivity.this

np.

Toast.makeText(MyListenerClass.this, "Service Stopped", Toast.LENGTH_LONG).show(); 
Powiązane problemy