2012-01-03 35 views
7

Tôi đang cố gắng những đoạn mã sau đây, nơi một dịch vụ đang triển khai nghe tôi:Null Pointer trong 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(); 
    } 

Bây giờ, bánh mì nướng bên trong onCreate() đang làm việc tốt, nhưng điều đó bên trong phương pháp ghi đè đang ném ngoại lệ sau:

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) 

Tôi đoán tôi đang thiếu một số khái niệm java quan trọng. Không, chúng tôi sử dụng getApplicationContext() bên trong một phương pháp ghi đè?

+0

Theo hướng dẫn (http://developer.android.com/reference/android/app/Service.html) bạn sẽ có thể thực hiện. Có gì bên trong 'stopSelf()'? – Asahi

+0

Không có gì ở bên trong điểm dừng(). Dịch vụ tiếp tục chạy cho đến khi stopelf() được gọi là –

Trả lời

0

Không chắc chắn nếu bạn có thể như thế này bên trong một dịch vụ, nhưng nếu nó hoạt động trong onCreate (và đường dẫn mã này thực sự được gọi), bạn có thể dễ dàng lưu ngữ cảnh vào biến cục bộ trong onCreate và sau đó sử dụng nó trong phương pháp của bạn.

+0

Bên trong onCreate() Tôi đã thử điều này: mContext = MyListenerClass.this; và sau đó sử dụng mCOntext bên trong phương pháp ghi đè của tôi. Tuy nhiên nó đang bị rơi –

7

Bạn nên cố gắng tránh sử dụng getApplicationContext() càng nhiều càng tốt, vì điều này sẽ làm tăng cơ hội nhận được Đóng quân.

Thay vào đó hãy sử dụng YourClass.this, trong trường hợp này là MyListenerClass.this.

Tôi đoán trong ví dụ này nó không hoạt động, vì getApplicationContext() được gọi saustopSelf()

+3

Tại sao gọi 'getApplicationContext()' lại tăng cơ hội nhận được một Đóng quân? –

+0

Ví dụ, nếu bạn gọi nó trong một phương pháp OnClick bị quá tải, nó có thể - tùy thuộc vào thiết bị/firmware/sdk - sự cố. Hoặc xem mã ở trên: nếu 'this' được sử dụng, nó sẽ không ném ngoại lệ. – Force

+0

Tôi đã thử sử dụng MyListenerClass.this và thậm chí xóa điểm dừng(). Tuy nhiên nó đang rơi cho cùng một bản ghi. Hơn nữa, tôi không thấy bất cứ điều gì trong các bản ghi cho thấy rằng đó là một vụ tai nạn firmware –

0

nâng cốc chúc mừng chỉ có thể được thêm vào Hoạt động như bối cảnh.

-1

Bạn đã tạo ngữ cảnh cho hoạt động và chuyển ngữ cảnh đó.

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

    } 
} 

điều này thực sự hiệu quả đối với tôi.

0

Bạn có tuyên bố nó như là một quá trình mới, trong trường hợp này bạn có thể có được con trỏ null ngoại lệ

android:process=":MyListenerClass" 

Trong Process bối cảnh getApplicationContext() sẽ không hoạt động.

Bạn có thể xác minh điều này bằng cách kiểm tra nhật ký xem liệu TID và PID của bạn Hoạt động và dịch vụ có giống nhau hay không.

0

Cố gắng cung cấp cho MyListenerClass.this hoặc YourActivity.this

ví dụ.

Toast.makeText(MyListenerClass.this, "Service Stopped", Toast.LENGTH_LONG).show(); 
Các vấn đề liên quan