0

I am working on an application. To make simple, it has this design :

ServiceManager <--------> CommService -------> doing stuff via AsyncTask...

I am trying to bound my ServiceManager to CommService. So, CommService has a Binder. And I have a NullPointerException and I don't know how to fix it. I think the ServiceConnection don't do its job and the bind is not active.

Code of ServiceManager here :

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é");

    }

Code of CommService here :

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

}

Code of CommBinder here :

public class CommBinder extends Binder {

private CommService service;

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

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

Logcat here :

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 .probecontroller.android.services.ProbeManagerService@40516da8 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

Any help is welcome. It's been hours working on this problem and I read a lot of forums, posts, and nothing work at all.

Eriatolc
  • 197
  • 1
  • 1
  • 10
  • Here's the same question but with an example: http://stackoverflow.com/questions/9211994/android-trouble-with-bindservice-service-is-null –  May 21 '15 at 22:15

1 Answers1

4

You are invoking getActions() on ProbeManagerService before the service is bound, apparently, because the only thing that can be null is mService. bindService() is asynchronous; you will not yet be bound when that method returns.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • Thanks for the answer, CommonsWare. So, how could I be sure that the bound is done ? Is there a method are something ? – Eriatolc Jun 19 '12 at 18:31
  • 2
    @Eriatolc: Sure, it's the `onServiceConnected()` you are already implementing. You need to make sure that you will never call `getActions()` before `onServiceConnected()` is called. – CommonsWare Jun 19 '12 at 19:47
  • Thanks for your attention. If I understand well, I can check the boolean `mBound` before each call to a method, as `getActions()`for example. If `mBound = false`, the service is not linked. But, the `Service` calls the `onCreate()`, where the `bindService()`is done; and directly goes to `onStartCommand()`. How could I manage to do again the `onStartCommand()` if the first time this method is read, the bound is not here? In fact, this `Service` will be a sort of controller, so, if all the `onStartCommand()` is done one time (and finished), what is the best way to use it properly? – Eriatolc Jun 19 '12 at 20:19
  • @Eriatolc: I'd start by getting rid of all of these services and starting over from scratch. You probably do not need more than one service in the first place, let alone having one service bind to another. Your objective should be *fewer* services, not more services. – CommonsWare Jun 19 '12 at 20:24
  • It brings me back to [this thread](http://goo.gl/5zXb4) about how to design this app. I have to ask, at regular intervals (defined by the user) a remote server to get actions to do. Once actions are recovered and executed, I have to send the results to another server. But (and it's the difficult point to me), all this have to work in "background", without a view opened and without user interactions (he can do whatever he wants with his phone). The user just has to start/stop the app when he wants. The best example I think is a mail client or a music player, and i don't know how to design that – Eriatolc Jun 19 '12 at 20:37
  • @Eriatolc: I am not saying "use no services". I am saying "use one service". I see nothing your app description that requires more than one service. – CommonsWare Jun 19 '12 at 20:39
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/12782/discussion-between-eriatolc-and-commonsware) – Eriatolc Jun 20 '12 at 07:09