2016-08-03 64 views
0

這是場景,在我的應用程序中我有一個故事發布功能。在創建帖子時,用戶可以附加一張照片。然後,我想要的是在用戶從照片中選擇一張照片後將照片上傳到我的服務器畫廊,而不是在用戶點擊發布按鈕之後。上傳完成後,回調會提供上傳是否成功的信息。另外,如果有照片上傳到服務器,則用戶點擊發布按鈕,所有正在上傳的照片將被取消。要使用AsyncTask或服務?

僞碼

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

for each photoUri in tempList 

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

問題: 我在哪裏可以做的照片上傳,以便從主線程分離它,然後返回一個回調,如果照片是在上傳成功與否活動?並可以取消?

在AsyncTask或服務?雖然答案不限於這兩個,但你可以提出任何你認爲合適的建議。

+0

使用_AsyncTask_ – Piyush

回答

1

請記住,默認情況下,Service在UI線程上運行,因此如果您使用它,則應該創建並管理自己的新Thread,這意味着需要更多的代碼行來維護。一個IntentService運行在自己的線程,所以我寧願這一個,而不是Service,和AsyncTask

我建議使用第三方庫,如retrofit,它管理着你的連接細節,如果考慮到你的項目需求,這是可能的;在this tutorial中,您可以看到如何將文件上載到服務器,翻新處理UI線程問題,在其外部執行請求並在其中返回響應,以便您可以更新視圖。

+0

線程的好處! – AlbAtNf

+0

謝謝,這個答案真的很有幫助。還有一個問題,我可以使用Volley嗎? – devadnqpnd

+0

當然,Volley是處理HTTP請求的另一個非常常見的庫。我沒有用它上傳文件,但這不應該是一個問題。 – voghDev

0

如果您使用AsyncTask,則必須注意方向更改。對我而言,這並不是最好的方式。

我覺得使用服務要乾淨得多。更具體的IntentService

此服務旨在處理它自己的線程上的一次性任務(正常服務在UI線程上運行)。你通過發送一個意圖作爲額外的圖像的Uri來啓動它。 IntentService內部處理接收到的附加內容的Intent(從Uri上傳圖像)。完成後,通過向該活動發送廣播來通知活動(當然,您必須爲此註冊一個監聽器)。一個非常好的教程是here。谷歌的官方指南是here

一旦開始,您不必照顧方向更改。

取消IntentService有點棘手,but can be done。但是也許你應該讓它在服務器端上傳並放棄它,如果一段時間後(或其他一些機制)沒有上傳適合的帖子。

您的情況不需要使用AIDL服務,因爲活動和服務在同一個進程中運行。

相關問題