我正在尝试以下代码,其中服务正在实现我的监听器:
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();
}
现在,onCreate()中的toast工作正常,但是在重写方法中的内容会引发以下异常:
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)
我想我错过了一些重要的java概念。我们不能在重写方法中使用getApplicationContext()吗?
答案 0 :(得分:8)
你应该尽量避免使用getApplicationContext()
,因为这会大大增加获得Force Closes的机会。
而是使用YourClass.this
,在这种情况下为MyListenerClass.this
。
我想在这个例子中它不起作用,因为getApplicationContext()
在 stopSelf()
之后被称为
答案 1 :(得分:0)
不确定您是否可以,因为它似乎在服务中,但如果它在onCreate
中工作(并且实际调用此代码路径),您可以轻松地将上下文保存到{{1中的本地变量然后在你的方法中使用它。
答案 2 :(得分:0)
Toast只能添加到Activity这样的上下文中。
答案 3 :(得分:0)
您是否将其声明为新进程,在这种情况下,您可能会获得空指针异常
android:process=":MyListenerClass"
在Process上下文中,getApplicationContext()将无效。
您可以通过检查logcat来验证这一点,以确定您的活动和服务的TID和PID是否相同。
答案 4 :(得分:0)
尝试提供MyListenerClass.this
或YourActivity.this
例如
Toast.makeText(MyListenerClass.this, "Service Stopped", Toast.LENGTH_LONG).show();
答案 5 :(得分:-1)
您需要为活动创建上下文并传递该上下文。
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();
}
}
这对我来说真的很有用。