0

I have a problem with my Android client. The nuxeo context contains a Context and a AndroidHttpClient

I tried to close by all the way possible but there are only the method. Shutdown () and it prevents me to question my nuxeo server later in my app

How can I close it ?

Stack print

05-20 11:46:06.945: E/AndroidHttpClient(24191): Leak found
05-20 11:46:06.945: E/AndroidHttpClient(24191): java.lang.IllegalStateException: AndroidHttpClient created and never closed
05-20 11:46:06.945: E/AndroidHttpClient(24191): at android.net.http.AndroidHttpClient.<init>(AndroidHttpClient.java:158)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at android.net.http.AndroidHttpClient.newInstance(AndroidHttpClient.java:144)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at org.nuxeo.ecm.automation.client.android.AndroidAutomationClient.<init>(AndroidAutomationClient.java:115>)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at org.nuxeo.android.context.NuxeoContext.getNuxeoClient(NuxeoContext.java:168)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at org.nuxeo.android.context.NuxeoContext.<init>(NuxeoContext.java:110)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at org.nuxeo.android.context.NuxeoContext.<init>(NuxeoContext.java:82)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at com.example.androidnuxeo.MainActivity.onCreate(MainActivity.java:90)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at android.app.Activity.performCreate(Activity.java:4562)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at android.app.ActivityThread.access$600(ActivityThread.java:128)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at android.os.Handler.dispatchMessage(Handler.java:99)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at android.os.Looper.loop(Looper.java:137)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at android.app.ActivityThread.main(ActivityThread.java:4514)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at java.lang.reflect.Method.invokeNative(Native Method)
05-20 11:46:06.945: E/AndroidHttpClient(24191): at java.lang.reflect.Method.invoke(Method.java:511)

Code

 NuxeoContext ctx = new NuxeoContext(getBaseApplication());

try {

    Session session = Connection.getSession();

    itemID = ((TwoLineListItem) view).getText2().getText().toString();
    itemTitle =((TwoLineListItem) view).getText1().getText().toString();

    RequeteDetail requete = new RequeteDetail();
    res = requete.execute(itemID,ctx).get();
    type = res.getType();

} catch (Exception e) {
    System.err.println(e);
    e.printStackTrace();
}

NuxeoContext :

public synchronized AndroidAutomationClient getNuxeoClient() {
    while (nuxeoClient != null && shuttingDown) {
        try {
            wait(100);
        } catch (InterruptedException e) {
            // Do nothing
        }
    }
    if (nuxeoClient == null || nuxeoClient.isShutdown()) {
        shuttingDown = false;
       nuxeoClient = new AndroidAutomationClient(
               serverConfig.getAutomationUrl(), androidContext,
                sqlStateManager, blobStore, networkStatus, serverConfig);
        Log.i(TAG, "new Nuxeo client " + nuxeoClient);
        if (Log.isLoggable(TAG, Log.DEBUG)) {
            Log.d(TAG, "Call stack: ", new Exception());
        }
    }
    return nuxeoClient;
}

Connection.getSession :

public class Connection extends AsyncTask<NuxeoContext, Void, Session> {

Context ctx;
static Session session;

protected Session doInBackground(NuxeoContext... params) {

    if(session == null || session.getClient().getBaseUrl() == null) {
        NuxeoContext nctx= params[0];
        session = nctx.getSession();    

        System.err.println("create connexion");
    }
    else {
        System.err.println("connexion already open");
    }

   return session;
}

public static Session getSession() {
    if(session == null || session.getClient() == null) {
        System.err.println("No connexion");
    }
    return session;
}
}

I integrated the Nuxeo connector as a library and I don't use the fragment, only activities.

Pico
  • 1
  • 3

1 Answers1

0

What do you mean?

if I don't close it my app doesn't work

You can call org.nuxeo.android.context.NuxeoContext.shutdown() that will shutdown the nuxeoClient (org.nuxeo.ecm.automation.client.android.AndroidAutomationClient.shutdown()) and close its AndroidHttpClient... but you should have to do that only in the onDestroy() activity methods, if not inheriting from Nuxeo activities.
The NuxeoContext manages itself the AndroidAutomationClient and its session. Going down such details is still possible but error prone.

Could you please add the imports in your code snippet? What is Connection.getSession()?

How did you integrate the Nuxeo Android connector with your application: composition or inheritance? Using the Nuxeo activities or the fragments or your custom implementations? Depending on the answer, you should use one of the two following methods:

org.nuxeo.android.context.NuxeoContextFactory.getNuxeoContext(Context)
org.nuxeo.android.context.NuxeoContext.get(getApplicationContext())

Then those methods are recommended to get a NuxeoClient or Session:

org.nuxeo.android.context.NuxeoContext.getNuxeoClient()
org.nuxeo.android.context.NuxeoContext.getSession()
org.nuxeo.ecm.automation.client.android.AndroidAutomationClient.getSession()

I guess I just understood your issue: do you create a new NuxeoContext in each activity? It must be a singleton. If so, using the NuxeoContextFactory should solve your issue and avoid the need to close it so often.

Julien Carsique
  • 3,915
  • 3
  • 22
  • 28
  • I need of nuxeoContext to query Nuxeo, but it shutdown itself without any apparent reason – Pico May 22 '14 at 09:49
  • Of course you need the NuxeoContext. Did you try my suggested solutions? I'm not convinced by your Connection class: is it useful? If you want or need to manage yourself some parts of the Nuxeo Connector, then you can give a look at https://github.com/artmoni/gardening-manager-android/blob/master/gardening-manager-android/src/org/gots/nuxeo/NuxeoManager.java . – Julien Carsique May 22 '14 at 15:01
  • I don't understand when you say "it shutdowns itself": what is your need and what is(are) the issue(s)? You first asked for a way to shutdown it (whereas you should not need that except for your application termination or in a few border cases) and now you complain about unwanted shutdowns (which should not happen but the way you manipulate the NuxeoContext and its session may be the root cause). – Julien Carsique May 22 '14 at 15:02