2014-02-18 5 views
5

Ich entwickle eine Anwendung, in der mehrere Fragmente beteiligt sind. In jedem Fragment muss ich Web-Service aufrufen, um Daten zu holen.Android-Fragment: Welche Lebenszyklus-Methode für Web-Service-Aufruf verwenden

Zur Zeit rufe ich Web-Service von onCreateView() Methode von Fragment. Problem, das ich erhalte, wenn ein Web Service-Aufruf ausgeführt wird und wenn die Geräteausrichtung geändert wird, beginnt der Aufruf eines neuen Web Service.

Ich denke, dies könnte sein, weil onCreateView() -Methode bei Konfigurationsänderung aufgerufen wird.

Wie kann ich das lösen? und welche Life Cycle-Methode sollte ich Web-Service aufrufen, so dass es nur einmal aufgerufen wird

+0

Ich habe das gleiche Problem. Wenn ich den Tab um 90 Grad wähle, wird 'onCreate' erneut aufgerufen und versucht, den bereits geöffneten Socket erneut zu öffnen, und da der Socket vor dem Drehen des Tabs nicht geschlossen wurde, tritt ein Fehler auf und die Anwendung bricht ab. Ihr Fall unterscheidet sich jedoch von meinem, weil Sie keinen Fehler erhalten, nur eine neue Verbindung wird gestartet – mangusta

+0

Ich habe versucht, ein bestimmtes Ereignis zu finden, um Orientierungsänderung abzufangen und den Socket vor dem Neustart der Aktivität zu schließen, aber keinen Erfolg.Eines ist sicher, 'onCreate()' aufgerufen wird, wenn Ausrichtung ändert – mangusta

+0

PS. Hmm, erkannte, dass ich überprüfen, ob das Socket geöffnet ist oder nicht gleich am Anfang von 'onCreate()' und schließen Sie es, wenn es :) – mangusta

Antwort

2

Ich habe diese Abhilfe

    durch folgende aufgelöst
  1. eine Operation Kennung für jede Web-Service-Call-Methode erstellen. Z.B. zum Beispiel „Authentifizierung“ für die Anmeldung Anruf

  2. erstellen ein Objekt von Arraylist sagen currentTasks

    ArrayList<String> currentTasks = new ArrayList<String>(); 
    
  3. In jedem Verfahren, wo ich Web-Service nenne, ob Betriebsidentifizierer Methode entsprechenden vorhanden ist bereits in Arraylist . Wenn nicht, dann starte den Betrieb.

    String operationId = "Authentication"; 
    if(currentTasks.indexOf(operationId) == -1) 
    { 
        <do web service call operation here> 
        currentTasks.add(operationId); 
    } 
    
  4. Methode als Antwort dem obigen Vorgang der empfängt, entfernen Betrieb Kennung von Arraylist

    if(currentTasks.indexOf("Authentication") != -1){ 
        currentTasks.remove("Authentication"); 
    } 
    

Dies wird diesen Anruf gewährleisten wird nicht auf dem Web-Methode gehen, die derzeit im Gange ist.

Ich weiß, das ist nicht der beste Weg, um es zu erreichen und dies ist vielleicht nicht die beste Praxis zu folgen, aber für jetzt funktioniert das für mich.

0

Wenn Ihr Web-Service-Code aufgrund einer Änderung der Geräteausrichtung neu gestartet wird, dann verwenden Sie wahrscheinlich eine AsyncTask. Dies ist ein häufiges Problem mit AsyncTasks und Sie haben mehrere Möglichkeiten, es zu lösen.

Eine häufige Problemumgehung besteht darin, Ihre AsyncTask um eine unsichtbare Fragment zu wickeln und sicherzustellen, dass dieses Fragment während einer Orientierungsänderung nicht zerstört und erneut erstellt wird. Sehen Sie sich dieses Tutorial an: Retaining Objects Across Config Changes

+0

können Sie einen Code zur Verfügung stellen, die diese mehr erklären kann? – silwar

+0

Überprüfen Sie den Link, den ich oben hinzugefügt habe. Wenn Sie zu dieser Website gehen, schauen Sie in der „Empfehlung: Verwalten Sie das Objekt innerhalb eines Fragments Retained“ für ein komplettes Beispiel Abschnitt. – Henrique

0

Eine einfache Lösung wäre eine statische Variable, die auf asynctask verweist. Erstellen und rufen Sie eine AsyncTask auf, wenn die Variable nicht null ist.

Grüße, Prateek

+0

Seien Sie vorsichtig mit diesem Ansatz. Das Halten einer statischen Variablen während Rotationsänderungen ist sehr anfällig für Speicherlecks. – Henrique

+0

@Henrique Können Sie bitte den Fall für die –

+0

Die vollständige Erklärung ist ein Thema für sich allein und zu lange hinzugefügt werden als Kommentar, sondern nur als ein Beispiel erklären, sagen wir, Sie eine statische AsyncTask haben, die einen Verweis hält es ist Eigentümer Aktivität. Wenn die Aktivität zerstört wird, weil der Benutzer es verlassen, aber die AsyncTask noch nicht abgeschlossen, wird die Aktivität noch am Leben gehalten werden, da es eine Live-Referenz ist. Wir sind also im Grunde Sachen zu halten um die nicht da sein sollten und vom Garbage Collector gelöscht worden sind. Versuchen Sie, nach androiden Speicherlecks für andere spezielle Fälle zu suchen. – Henrique