2012-06-19 60 views
0

我正在處理一個應用程序。爲了簡單,它有這樣的設計:當我調用bindService時,空指針

的ServiceManager < --------> CommService ------->通過的AsyncTask做的東西......

我想結合我的ServiceManager到CommService。所以,CommService有一個活頁夾。我有一個NullPointerException,我不知道如何解決它。我認爲ServiceConnection沒有完成它的工作,綁定不活躍。

代碼的ServiceManager這裏:

public class CommService extends Service implements IComm { 

private final CommBinder binder = new CommBinder(this); 
private HttpClient client; 


public CommService() { 
    super(); 
} 

public void onCreate() { 
    super.onCreate(); 
    this.client = new DefaultHttpClient(); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return binder; 
} 

public void onDestroy() { 
    super.onDestroy(); 
    this.client.getConnectionManager().shutdown(); 
} 

// ============ METHODES A IMPLEMENTER DE L'INTERFACE IComm ============== 
@Override 
public void getActions(ICommListener listener, String url, String json, String type) { 
    new SendHttpRequest(listener).execute(url, json, type); 

} 

CommBinder這裏的代碼:

public class ProbeManagerService extends Service implements ICommManager, ICommListener { 
    private CommService mService; 
    private boolean mBound; 

    private ServiceConnection svc1 = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder rawBinder) { 
     CommBinder commBinder = (CommBinder) rawBinder; 
     mService = commBinder.getService(); 
     mBound = true; 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     //commBinder = null; 
     mBound = false; 
    } 
    }; 

    public void onCreate() { 
     Log.i("ProbeManagerService, onCreate", "passage dans le onCreate du Service"); 
     super.onCreate(); 
     Intent bindIntent = new Intent(this, CommService.class); 
     //startService(bindIntent); changes nothing with or without this line 
     bindService(bindIntent, svc1, Context.BIND_AUTO_CREATE); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 


    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.i("ProbeManagerService, onStartCommand", "passage dans le onStartCommand du Service"); 
     this.getActions(); 
     return START_STICKY; 
    } 


    public void onDestroy() { 
     super.onDestroy(); 
    } 

    @Override 
    public void getActions() { 
     if(mBound) 
      this.mService.getActions(this, urlGetActions, jsonGetActions, GET_ACTIONS); 
     else 
      System.out.println("On n'est pasl lié"); 

    } 

CommService這裏的代碼

public class CommBinder extends Binder { 

private CommService service; 

public CommBinder(CommService service) { 
    this.service = service; 
} 

public CommService getService() { 
    return this.service; 
} 

logcat的位置:

06-19 18:03:35.665: I/ProbeManagerService, onCreate(25705): passage dans le onCreate du Service 
06-19 18:03:35.775: I/System.out(25705): fichier lus 
06-19 18:03:35.785: I/ProbeManagerService, onStartCommand(25705): passage dans le onStartCommand du Service 
06-19 18:03:35.815: D/AndroidRuntime(25705): Shutting down VM 
06-19 18:03:35.815: W/dalvikvm(25705): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
06-19 18:03:35.855: E/AndroidRuntime(25705): FATAL EXCEPTION: main 
06-19 18:03:35.855: E/AndroidRuntime(25705): java.lang.RuntimeException: Unable to start service [email protected] with Intent { cmp=.probecontroller.android.controller/.probecontroller.android.services.ProbeManagerService }: java.lang.NullPointerException 
06-19 18:03:35.855: E/AndroidRuntime(25705): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2052) 
06-19 18:03:35.855: E/AndroidRuntime(25705): at android.app.ActivityThread.access$2800(ActivityThread.java:117) 
06-19 18:03:35.855: E/AndroidRuntime(25705): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:994) 
06-19 18:03:35.855: E/AndroidRuntime(25705): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-19 18:03:35.855: E/AndroidRuntime(25705): at android.os.Looper.loop(Looper.java:123) 
06-19 18:03:35.855: E/AndroidRuntime(25705): at android.app.ActivityThread.main(ActivityThread.java:3683) 
06-19 18:03:35.855: E/AndroidRuntime(25705): at java.lang.reflect.Method.invokeNative(Native Method) 
06-19 18:03:35.855: E/AndroidRuntime(25705): at java.lang.reflect.Method.invoke(Method.java:507) 
06-19 18:03:35.855: E/AndroidRuntime(25705): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
06-19 18:03:35.855: E/AndroidRuntime(25705): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
06-19 18:03:35.855: E/AndroidRuntime(25705): at dalvik.system.NativeStart.main(Native Method) 
06-19 18:03:35.855: E/AndroidRuntime(25705): Caused by: java.lang.NullPointerException 
06-19 18:03:35.855: E/AndroidRuntime(25705): at .probecontroller.android.services.ProbeManagerService.getActions(ProbeManagerService.java:162) 
06-19 18:03:35.855: E/AndroidRuntime(25705): at .probecontroller.android.services.ProbeManagerService.onStartCommand(ProbeManagerService.java:124) 
06-19 18:03:35.855: E/AndroidRuntime(25705): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2039) 
06-19 18:03:35.855: E/AndroidRuntime(25705): ... 10 more 
06-19 18:03:51.226: I/Process(25705): Sending signal. PID: 25705 SIG: 9 

歡迎任何幫助。在這個問題上工作了幾個小時,我閱讀了很多論壇,帖子,根本沒有任何工作。

+0

這是同樣的問題,但用一個例子: http://stackoverflow.com/questions/9211994/android-trouble-with-bindservice-service-is-null –

回答

4

在服務被綁定之前,您正在調用getActions(),ProbeManagerService,顯然,因爲唯一可以是null的是mServicebindService()是異步的;當該方法返回時,您將不會被綁定。

+0

感謝您的回答,CommonsWare。那麼,我怎麼能確定綁定完成了?有什麼方法嗎? – Eriatolc

+2

@Eriatolc:當然,這是你已經實現的'onServiceConnected()'。在調用onServiceConnected()之前,您需要確保永遠不會調用getActions()。 – CommonsWare

+0

感謝您的關注。如果我理解的很好,我可以在每次調用方法前檢查布爾型'mBound',例如'getActions()'。如果'mBound = false',服務沒有鏈接。但是,'Service'調用'bindService()'完成的'onCreate()';並直接進入'onStartCommand()'。如果第一次讀取這個方法,綁定不在這裏,我怎麼能設法再次執行'onStartCommand()'?事實上,這個'Service'將會是一種控制器,所以,如果所有'onStartCommand()'完成一次(並完成),那麼正確使用它的最好方法是什麼? – Eriatolc

相關問題