2016-08-03 61 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服务,因为活动和服务在同一个进程中运行。

相关问题