2016-08-03 4 views
0

私のアプリでは、ストーリー投稿機能があります。投稿を作成するときに、写真を添付することができます。ユーザーが写真を選択した後、サーバーに写真をアップロードすることができます。ユーザーがポストボタンをクリックした後ではありません。アップロードが完了した後、コールバックはアップロードが成功したかどうかの情報を提供します。また、写真がサーバーにアップロードされている場合、ユーザーがポストボタンをクリックすると、アップロードされているすべての写真がキャンセルされます。AsyncTaskまたはServiceを使用するには?

擬似コード

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

for each photoUri in tempList 

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

QUESTION:写真が正常にアップロードまたはないされた場合は、コールバックを返し、私はメインスレッドからそれを分離するために写真のアップロードを行うことができます アクティビティ?キャンセル可能ですか?

AsyncTaskまたはServiceで、答えはこれらの2つに限定されませんが、適切であると思われるものを示唆することができます。

+0

使用_AsyncTask_ – Piyush

答えて

1

デフォルトでUIスレッドでServiceが実行されるので、使用する場合は、独自の新しいThreadを作成して管理する必要があります。これは、維持するコード行が増えることを意味します。 IntentServiceは独自のスレッドで実行されるので、ServiceAsyncTaskではなく、このスレッドを優先します。

あなたのプロジェクトの要件を考えれば、接続の詳細を管理するretrofitのようなサードパーティのライブラリを使用することをお勧めします。 this tutorialでは、サーバーにファイルをアップロードする方法がわかります。更新すると、UIスレッドの問題が処理され、その外側の要求が実行され、その応答が返されるため、ビューを更新できます。

+0

スレッド上のポイント! – AlbAtNf

+0

ありがとう、この答えは本当に役に立ちます。もう1つの質問、私もバレーを使用できますか? – devadnqpnd

+0

もちろん、VolleyはHTTPリクエストを処理するための非常に一般的な別のライブラリです。私はそれを使ってファイルをアップロードしていませんが、それを行うのは問題ではありません。 – voghDev

0

AsyncTaskを使用する場合、方向変更を処理する必要があります。私にとってこれは実際には一番良い方法ではありません。

私はサービスを使う方がずっときれいだと思います。具体的にはIntentServiceです。

このサービスは、1回のタスクを独自のスレッドで処理するように設計されています(通常のサービスはUIスレッドで実行されます)。あなたはイメージのウリを追加してインテントを送ることでそれを始める。 IntentService内では、受け取ったインテントをエクストラで処理します(Uriから画像をアップロードします)。完了したら、そのアクティビティにブロードキャストを送信してアクティビティに通知します(もちろん、そのリスナーを登録する必要があります)。非常に良いチュートリアルはhereです。 Googleの公式ガイドはhereです。

開始されると、向きの変更に注意する必要はありません。

IntentServiceをキャンセルするのはちょっと難しいですが、but can be doneです。しかし、ちょうどちょっと後にアップロードされたフィッティングポスト(または他のメカニズム)がなければ、それをアップロードしてサーバ側で破棄するようにしてください。

AIDLのサービスは、アクティビティとサービスが同じプロセスで実行されているため、必要ではありません。

関連する問題