2012-01-03 28 views
7

Estoy intentando el siguiente fragmento de código, donde un servicio está poniendo en práctica mi oyente:de puntero nulo en 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(); 
    } 

Ahora, la tostada en el interior onCreate() está trabajando muy bien, pero que dentro de la el método reemplazado arroja la siguiente excepción:

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) 

Supongo que me falta algún concepto importante de Java. ¿No podemos usar getApplicationContext() dentro de un método reemplazado?

+0

Según el manual (http://developer.android.com/reference/android/app/Service.html) debería poder hacerlo. ¿Qué hay dentro de 'stopSelf()'? – Asahi

+0

Nada está dentro de stopself(). El servicio sigue en ejecución hasta que se llama a stopself() –

Respuesta

0

No estoy seguro si puede, ya que parece estar dentro de un servicio, pero si funciona en onCreate (y esta ruta de código se llama realmente) puede guardar fácilmente el contexto en una variable local en onCreate y luego usarlo en tu método.

+0

Inside onCreate() Intenté esto: mContext = MyListenerClass.this; y luego usé mCOntext dentro de mi método reemplazado. Todavía está fallando –

7

Debe intentar evitar el uso de getApplicationContext() tanto como sea posible, ya que esto aumentará en gran medida la posibilidad de obtener Force Closes.

En su lugar use YourClass.this, en este caso MyListenerClass.this.

supongo que en este ejemplo no funciona, porque getApplicationContext() se llama despuésstopSelf()

+3

¿Por qué la llamada 'getApplicationContext()' aumenta las posibilidades de obtener un cierre forzado? –

+0

Por ejemplo, si lo llama en un método OnClick modificado, podría, en función del dispositivo/firmware/sdk, fallar. O vea el código de arriba: si se usa 'this', no arrojaría la excepción. – Force

+0

He intentado utilizar MyListenerClass.this e incluso eliminado stopself(). Todavía está fallando dando el mismo registro. Además, no vi nada en los registros que sugiera que se trata de una falla de firmware. –

0

tostadas sólo se pueden añadir a la actividad como contexto.

-1

Tiene que crear contexto para la actividad y pasar ese contexto.

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

    } 
} 

esto realmente me funciona.

0

Did que lo declaró como un nuevo proceso, en este caso, es posible que obtenga la excepción de puntero nulo

android:process=":MyListenerClass" 

En el contexto del proceso getApplicationContext() no funcionará.

Puede verificar esto marcando en el logcat si TID y PID de su Actividad y servicio son los mismos.

0

tratar de dar MyListenerClass.this o YourActivity.this

por ejemplo.

Toast.makeText(MyListenerClass.this, "Service Stopped", Toast.LENGTH_LONG).show(); 
Cuestiones relacionadas