2012-12-21 59 views
2

嗨,謝謝你的幫助。綁定服務調用給NullPointerException

我有以下活動(請參閱下面的代碼)。活動綁定(或嘗試綁定)到服務。

該服務公開(或應該公開)一個公共方法getNumber()來檢索一個數字。

當執行到達

mService.getNumber() 

應用程序將停止運行一個NullPointerException。

我調試了,我所能理解的是,由於某種原因mService.getNumber()導致了這個問題。

編輯:很明顯,服務不綁定,我測試的mBound布爾的

Intent intent = new Intent(this, LocalService.class); 
     bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 

後返回false,因此該服務不綁定...問題是存在的!

感謝您的任何建議

public class Quotes extends Activity { 
    public LocalService mService; 
    boolean mBound = false; 
    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 
      // Bind to LocalService 
     Intent intent = new Intent(this, LocalService.class); 
     bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 
     Log.e("", "arrivo a prima di loop"); 
     for(int a=0;;a++){ 
      SystemClock.sleep(500); 
      Log.e("", "sono nel loop"); 
      int num =mService.getNumber(); 
      Toast.makeText(this,Integer.toString(num),  Toast.LENGTH_SHORT).show(); 
       } 
    } 
     private ServiceConnection mConnection = new ServiceConnection() { 
      //@Override 
      public void onServiceConnected(ComponentName className, 
        IBinder service) { 
       Log.e("", "sono in ServiceConnection"); 
    // We've bound to LocalService, cast the IBinder and get LocalService instance 
       LocalBinder binder = (LocalBinder) service; 
       mService = binder.getService(); 
       mBound = true; 
      } 
      //@Override 
      public void onServiceDisconnected(ComponentName arg0) { 
       mBound = false; 
      } 
     }; 

這是服務的代碼:

package com.example.quotes; 

@TargetApi(3) 
public class LocalService extends Service { 
    public int i; 
    // Binder given to clients 
    private final IBinder mBinder = new LocalBinder(); 
       * Class used for the client Binder. Because we know this service always 
     * runs in the same process as its clients, we don't need to deal with IPC. 
     */ 
    public class LocalBinder extends Binder { 
     LocalService getService() { 
      // Return this instance of LocalService so clients can call public methods 
      return LocalService.this; 
     } 
    } 
    @Override 
    public IBinder onBind(Intent intent) { 
     Log.e("", "sono nel service"); 
     new Task().execute(); 
     return mBinder; 
    } 
     class Task extends AsyncTask<Void, String, Void> { 
     @Override 
     protected Void doInBackground(Void... unused) { 
     for (i=0;;i++) { 
     Log.e("Sono nel AsyncTask del Service", Integer.toBinaryString(i)); 
     SystemClock.sleep(500); 
     } 
     //return(null); 
     } 
    } 

    public int getNumber() { 
     return i; 
    }  
} 

logcat的:

12-21 12:05:18.837: D/AndroidRuntime(889): Shutting down VM 
12-21 12:05:18.837: W/dalvikvm(889): threadid=1: thread exiting with uncaught exception  (group=0x40a13300) 
12-21 12:05:18.887: E/AndroidRuntime(889): FATAL EXCEPTION: main 
12-21 12:05:18.887: E/AndroidRuntime(889): java.lang.RuntimeException: Unable to start  activity ComponentInfo{com.example.quotes/com.example.quotes.Quotes}:  java.lang.NullPointerException 
12-21 12:05:18.887: E/AndroidRuntime(889): at  android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
12-21 12:05:18.887: E/AndroidRuntime(889): at  android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
12-21 12:05:18.887: E/AndroidRuntime(889): at  android.app.ActivityThread.access$600(ActivityThread.java:130) 
12-21 12:05:18.887: E/AndroidRuntime(889): at  android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
12-21 12:05:18.887: E/AndroidRuntime(889): at  android.os.Handler.dispatchMessage(Handler.java:99) 
12-21 12:05:18.887: E/AndroidRuntime(889): at android.os.Looper.loop(Looper.java:137) 
12-21 12:05:18.887: E/AndroidRuntime(889): at android.app.ActivityThread.main(ActivityThread.java:4745) 
12-21 12:05:18.887: E/AndroidRuntime(889): at  java.lang.reflect.Method.invokeNative(Native Method) 
12-21 12:05:18.887: E/AndroidRuntime(889): at java.lang.reflect.Method.invoke(Method.java:511) 
12-21 12:05:18.887: E/AndroidRuntime(889): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
12-21 12:05:18.887: E/AndroidRuntime(889): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-21 12:05:18.887: E/AndroidRuntime(889): at dalvik.system.NativeStart.main(Native Method) 
12-21 12:05:18.887: E/AndroidRuntime(889): Caused by: java.lang.NullPointerException 
12-21 12:05:18.887: E/AndroidRuntime(889): at com.example.quotes.Quotes.onCreate(Quotes.java:91) 
12-21 12:05:18.887: E/AndroidRuntime(889): at android.app.Activity.performCreate(Activity.java:5008) 
12-21 12:05:18.887: E/AndroidRuntime(889): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
12-21 12:05:18.887: E/AndroidRuntime(889): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
12-21 12:05:18.887: E/AndroidRuntime(889): ... 11 more 
+2

可以爲您發佈錯誤 – urveshpatel50

+1

它是什麼(INT A = 0 ;; A ++) – Unknown

+1

使用意向意圖=新意圖(currentClassName,LocalService.class); – Unknown

回答

4

好的,foud解決謎語。

綁定到服務是異步的。

只有在調用onServiceConnected時,服務纔會被綁定;因此在onServiceConnected中,我添加了一個啓動需要在服務上執行的活動的方法。