要使用AsyncTask还是Service?

时间:2016-08-03 07:33:05

标签: android android-asynctask android-service

这就是场景,在我的应用程序中我有一个故事帖子功能。创建帖子时,用户可以附上照片。然后,我想要的是在用户从中选择照片后将照片上传到我的服务器图库,而不是用户点击发布按钮后。上传完成后,回调将提供上传是否成功的信息。此外,如果有照片上传到服务器,然后用户点击发布按钮,所有正在上传的照片都将被取消。

伪代码

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

for each photoUri in tempList

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

问题: 我可以在哪里上传照片以便将其从主线程中分离,然后如果照片成功上传或不在活动中,则返回回调?并且可以取消吗?

在AsyncTask或Service中?虽然答案不仅限于这两个,但您可以建议您认为合适的任何内容。

2 个答案:

答案 0 :(得分:1)

请记住,默认情况下,Service在UI线程上运行,因此如果您使用它,则应创建并管理自己的新Thread,这意味着需要维护更多代码行。 IntentService在自己的主题上运行,所以我更喜欢这个而不是ServiceAsyncTask

我建议使用像retrofit这样的第三方库来管理您的连接详细信息,如果可以考虑您的项目要求的话;在this tutorial中,您可以看到如何将文件上传到服务器,改造处理UI线程问题,在其外部执行请求以及在其中返回响应,以便您可以更新视图。

答案 1 :(得分:0)

如果使用AsyncTask,则必须注意方向更改。对我而言,这不是最好的方式。

我认为使用服务要干净得多。更具体的是IntentService

此服务旨在在其自己的线程上处理一次性任务(正常服务在UI线程上运行)。你可以通过向你的图像的Uri发送一个Intent作为额外的来启动它。在IntentService中,您可以使用附加功能处理收到的Intent(从Uri上传图像)。完成后,您通过向该活动发送广播来通知您的活动(当然您必须为此注册一个监听器)。一个非常好的教程是here。 Google的官方指南是here

一旦开始,您就不必处理方向更改。

取消IntentService有点棘手,but can be done。但也许你应该让它上传并在服务器端丢弃它,如果一段时间后没有上传适合的帖子(或其他一些机制)。

您的案例中不需要AIDL的服务,因为活动和服务在同一个流程中运行。