1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

HttpClient wieder schliessen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von neubs, 27.03.2012.

  1. neubs, 27.03.2012 #1
    neubs

    neubs Threadstarter Neuer Benutzer

    Beiträge:
    12
    Erhaltene Danke:
    0
    Registriert seit:
    07.03.2012
    Guten morgen allerseits,

    ich hab da mal ne Frage zum HttpClient.
    Ich habe einen Thread der eine Tabelle (SQLITE) durchschleift und einezelne Datensätze daraus über nen HttpClient sendet.
    Das funktioniert zwar soweit auch aber ich bekomme ab und zu nen Fehler:

    "Leak found - E/AndroidHttpClient(499): java.lang.IllegalStateException: AndroidHttpClient created and never closed".

    Nun wollte ich nach dem Senden den HttpClient wieder schliessen (client.close(); doch das lässt mir irgendwie Eclipse nicht zu - sagt dann immer "Nicht addressierbarer Code".

    Hier mal n bissl Code dazu:
    Code:
    @Override
            protected Boolean doInBackground(String... params) {
                boolean ret = false;    
                boolean retAll = false;    
                String sSql = "";
                int bookTS = 0;           
                int bookID = 0;            
                String bookType = "";
                SQLiteDatabase dbo =  null;
                
                datenbank db = new datenbank(myCtx);
                Verbindung cn = new Verbindung(myCtx);
                
                
                try {
                    dbo = openOrCreateDatabase(db.getDBName(), MODE_PRIVATE, null);
    
                    sSql = "SELECT _id, booktype, ts, sent FROM " + db.getBookingTableName() + " WHERE sent=0";
                    Cursor activeCursor = dbo.rawQuery(sSql, null);
                    
                    startManagingCursor(activeCursor);
                    activeCursor.moveToFirst();
                    
                    // Zuweisen des Maxwertes für die Progressbar
                    gesamtDS =  activeCursor.getCount();
                    
                    retAll = true;
                    
                    while (!activeCursor.isAfterLast()){                    
                        //Datensatzcounter um 1 erhöhen
                        actDS = actDS + 1;                
                        
                        publishProgress(actDS);
                     
                        bookType = activeCursor.getString(activeCursor.getColumnIndex("booktype"));
                        bookTS = activeCursor.getInt(activeCursor.getColumnIndex("ts"));
                        bookID = activeCursor.getInt(activeCursor.getColumnIndex("_id"));
                        // SendeString erstellen
                        String sSendString = cn.makeBookString( bookTS, "",bookType);
                        
    
                        
                        // und wegschicken ...
                        ret = cn.SendBookingToServer(sSendString);
                        
                        if (ret == true) {
     
                        } else {
                            retAll =false;
                        }
                            
                        activeCursor.moveToNext();
                    }
                } catch (Exception e) {
                    Log.e("Error", e.toString());
                }
                finally {
                    if (dbo != null) {
                        dbo.close();
                    }
                }
                return retAll;
            }
    
    Und auch nochmal die Funktion in der die Daten gesendet werden:
    Code:
    public boolean SendBookingToServer(String sBooking) {
            String sAnswer;
            
            try {
                sAnswer = "";
                if ((Server.compareTo("") != 0 ) &&  (Code.compareTo("")!=0) && (PIN.compareTo("") !=0) && (MitarbeiterNr.compareTo("")!=0) ) {                    
                    AndroidHttpClient client = AndroidHttpClient.newInstance("TxApp");                //Log.i("log", "client erzeugt");            
                    HttpGet req = new HttpGet(sBooking);                    //Log.i("log", "request erzeugt");            
                    HttpResponse resp = client.execute(req);                //Log.i("log", "response gesendet");                            
                    HttpEntity entinity = resp.getEntity();                 //Log.i("log", "entinity bekommen");
                    InputStreamReader reader = new InputStreamReader(entinity.getContent(), "utf-8");
                    
                    int c = reader.read();
                    while (c!=-1) {
                        sAnswer += (char)c;
                        c = reader.read();             
                    }
                    
                    sAnswer = sAnswer.trim();                                //Log.i("log", "Antwort:" + sAnswer  + "Len:" + sAnswer.length());
                    
                    if (sAnswer.compareTo("OK")==0) {
                        // Server meldete OK
                        return true;
                    } else {
                        return false;
                    }
    
                    // Hier wollte ich den Client wieder schliessen
                   client.close();
    
                } else {
                    return false;
                }
            } catch (IOException e) {
                Log.i("log", "error:" + e);
                return false;
            } 
        }
    
    Kann ich in der Funktion SendBookingToServer() überhaupt den HttpClient wieder schliessen? Und wenn ja wie kann ich das machen?
    Sonst müsste ich den ganzen Spass nochmal umbauen so das Funktion zum senden ein Array erhält in dem dann die einzelnen Datensätze zum senden stehen. In der entgültigen Verwendung der App werden wahrscheinlich sowieso nur 1 - 3 Datensätze auf einmal gesendet werden (das funktioniert ja) - wollte das ganze aber gleich sauber aufbauen um später keine bösen Überraschugen erleben zu müssen ;)

    Edit: getestet hab ich das ganze in der virtuellen Umgebung - eine andere Möglichkeit hab ich im Momtent leider nicht.

    Vielen Dank schonmal

    mfg
    sebastian
     
  2. sixi, 27.03.2012 #2
    sixi

    sixi Erfahrener Benutzer

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    die Stelle close() kann nie erreicht werden - das müsstest du schon vor dem return-Statement machen ;)
     
    neubs bedankt sich.
  3. neubs, 27.03.2012 #3
    neubs

    neubs Threadstarter Neuer Benutzer

    Beiträge:
    12
    Erhaltene Danke:
    0
    Registriert seit:
    07.03.2012
    Danke sixi ... manchmal ist man aber auch echt blind - ich such seit gestern abend und habs nicht gesehen.

    Vielen Dank nochmal

    mfg
    sebastian
     
  4. Tom299, 27.03.2012 #4
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Komisch, daß das Eclipse bei dir nicht merkt. Wenn ich bei mir testweise sowas einbaue

    Code:
    String sAnswer = "OK";
    if (sAnswer.compareTo("OK")==0) {
       // Server meldete OK
       return true;
    } 
    else {
       return false;
    }
            
    System.out.println("Test");
    
    dann meckert Eclipse die Zeile mit dem System.out an -> Unreachable Code
     
  5. neubs, 27.03.2012 #5
    neubs

    neubs Threadstarter Neuer Benutzer

    Beiträge:
    12
    Erhaltene Danke:
    0
    Registriert seit:
    07.03.2012
    Naja Eclipse sagte mir ja "Nicht addressierbarer Code". Ich wusste eben leider nicht was es da von mir wollte ...

    Habs aber jetzt trotzdem anders "gebaut":
    Der HttpClient wird gleich am Anfang definiert und im finally dann wieder geschlossen - ist glaub ich die sauberste Lösung für das ganze.

    mfg
    sebastian
     

Diese Seite empfehlen