2016-08-03 28 views
0

Dies ist das Szenario, in meiner App habe ich eine Geschichte post feature.While erstellen einen Beitrag, ein Benutzer kann ein Foto anhängen.Dann möchte ich das Foto auf meinen Server hochladen, nachdem ein Benutzer ein Foto aus der Galerie, nicht nachdem der Benutzer auf den Post-Button geklickt hat. Nachdem der Upload durchgeführt wurde, gibt ein Callback Informationen darüber, ob der Upload erfolgreich war oder nicht. Wenn Fotos auf den Server hochgeladen werden und ein Benutzer auf die Schaltfläche "Post" klickt, werden alle hochgeladenen Fotos gelöscht.Um AsyncTask oder Service zu verwenden?

Pseudo-Code

List tempList = [photoUri,photoUri,photoUri] 
List attachedPhotoUriList.copyValue(tempList); 

for each photoUri in tempList 

    uploadPhotoToServer(attachedPhotoUri,callback{ 
      onSuccess: 
       attachedPhotoUriList.remove(photoUri) 
      onError: 
    }) 

FRAGE: Wo kann ich das Hochladen von Fotos machen, um sie aus dem Haupt-Thread zu lösen dann einen Rückruf zurückgibt, wenn ein Foto erfolgreich hochgeladen oder nicht in eine wurde bereits Aktivität? und ist kündbar?

In AsyncTask oder Service? Obwohl die Antwort nicht auf diese beiden beschränkt ist, können Sie alles vorschlagen, was Sie für angemessen halten.

+0

Verwenden Sie _AsyncTask_ – Piyush

Antwort

1

Denken Sie daran, dass ein Service standardmäßig auf dem UI-Thread ausgeführt wird. Wenn Sie es also verwenden, sollten Sie Ihr eigenes neues Thread erstellen und verwalten, was mehr Codezeilen erfordert. Ein IntentService läuft auf einem eigenen Thread, also würde ich diesen lieber als die Service und die AsyncTask bevorzugen.

Was ich vorschlagen würde, ist die Verwendung einer Drittanbieter-Bibliothek wie retrofit, die die Verbindungsdetails für Sie verwaltet, wenn das unter Berücksichtigung der Anforderungen Ihres Projekts möglich ist; In this tutorial können Sie sehen, wie Sie Dateien auf einen Server hochladen, Retrofit kümmert sich um die Probleme mit der Benutzeroberfläche, erledigt die Anfrage außerhalb und gibt die Antwort zurück, damit Sie Ihre Ansichten aktualisieren können.

+0

Guter Punkt auf den Threads! – AlbAtNf

+0

Vielen Dank, diese Antwort ist sehr hilfreich. Noch eine Frage, kann ich auch Volley benutzen? – devadnqpnd

+0

Natürlich ist Volley eine weitere sehr häufige Bibliothek für die Behandlung von HTTP-Anfragen. Ich habe keine Dateien hochgeladen, aber das sollte kein Problem sein. – voghDev

0

Wenn Sie AsyncTask verwenden, müssen Sie sich um Orientierungsänderungen kümmern. Für mich ist das nicht der schönste Weg.

Ich denke, es ist viel sauberer, einen Service zu verwenden. Spezifischer ein IntentService.

Dieser Service ist so konzipiert, dass er einmalige Aufgaben in seinem eigenen Thread behandelt (der normale Service wird auf dem UI-Thread ausgeführt). Sie starten es, indem Sie eine Absicht mit dem Uri Ihres Bildes als Extra senden. Im IntentService behandeln Sie die erhaltene Absicht mit den Extras (Laden Sie das Bild von der Uri hoch). Wenn Sie fertig sind, benachrichtigen Sie Ihre Aktivität, indem Sie eine Übertragung an diese Aktivität senden (natürlich müssen Sie einen Listener dafür registrieren). Ein sehr gutes Tutorial ist here. Der offizielle Guide von Google ist here.

Nach dem Start müssen Sie sich nicht mehr um die Ausrichtung kümmern.

Das Abbrechen eines IntentService ist etwas komplizierter, but can be done. Aber vielleicht solltest du es einfach hochladen und auf der Serverseite verwerfen, wenn nach einiger Zeit kein passender Beitrag hochgeladen wurde (oder ein anderer Mechanismus).

Dienste mit AIDL werden in Ihrem Fall nicht benötigt, da die Aktivität und der Dienst im selben Prozess ausgeführt werden.