HttpClient wieder schliessen

N

neubs

Neues Mitglied
0
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
 
Code:
 if (sAnswer.compareTo("OK")==0) {
                    // Server meldete OK
    return true;
 } else {
    return false;
 }

 // Hier wollte ich den Client wieder schliessen
client.close();
die Stelle close() kann nie erreicht werden - das müsstest du schon vor dem return-Statement machen ;)
 
  • Danke
Reaktionen: neubs
Danke sixi ... manchmal ist man aber auch echt blind - ich such seit gestern abend und habs nicht gesehen.

Vielen Dank nochmal

mfg
sebastian
 
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
 
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
 

Ähnliche Themen

W
  • WuDiDong
Antworten
3
Aufrufe
765
jogimuc
J
S
  • SlayNox
Antworten
0
Aufrufe
682
SlayNox
S
A
  • Gesperrt
  • AGWInternational
Antworten
8
Aufrufe
949
swa00
swa00
Zurück
Oben Unten