使用 AsyncTask 还是 Service?
To use AsyncTask or Service?
这是场景,在我的应用程序中我有一个故事 post feature.While 创建一个 post,用户可以附加一个 photo.Then,我想要的是在用户从图库中选择照片后将照片上传到我的服务器,而不是在用户单击 post 按钮后。上传完成后回调将提供上传是否成功的信息。另外,如果有照片正在上传到服务器然后用户单击 post 按钮,所有正在上传的照片都将被取消。
伪代码
List tempList = [photoUri,photoUri,photoUri]
List attachedPhotoUriList.copyValue(tempList);
for each photoUri in tempList
uploadPhotoToServer(attachedPhotoUri,callback{
onSuccess:
attachedPhotoUriList.remove(photoUri)
onError:
})
问题:
我在哪里可以上传照片以便将其与主线程分离,然后 returns 如果照片上传成功或失败 activity 回调?可以取消吗?
在 AsyncTask 或服务中?虽然答案不仅限于这两个,你可以提出任何你认为合适的。
如果您使用 AsyncTask,则必须注意方向变化。对我来说这并不是最好的方式。
我认为使用服务更清洁。更具体的 IntentService.
此服务旨在在其自己的线程上处理一次性任务(正常服务在 UI 线程上运行)。您可以通过额外发送带有图像 Uri 的 Intent 来启动它。在 IntentService 中,您使用附加功能处理接收到的 Intent(从 Uri 上传图像)。完成后,您通过向 Activity 发送广播来通知您的 Activity(当然您必须为此注册一个侦听器)。一个很好的教程是 here. The official guide from Google is here.
一旦开始,您就不必注意方向的变化。
取消 IntentService 有点棘手,but can be done。但是也许你应该让它上传并在服务器端丢弃它,如果一段时间后没有合适的 post 上传(或其他一些机制)。
您的情况不需要带有 AIDL 的服务,因为 Activity 和服务 运行 在同一个进程中。
请记住,Service
默认在 UI 线程上运行,因此如果您使用它,您应该创建和管理自己的新 Thread
,这意味着更多行要维护的代码。 IntentService
在它自己的线程上运行,所以我更喜欢这个而不是 Service
和 AsyncTask
.
我的建议是使用像 retrofit which manages the connection details for you, if that's possible considering your project's requirements; In this tutorial 这样的第三方库,你可以看到如何将文件上传到服务器,改造会处理 UI 线程问题,做它外面的请求,并在其中返回响应,所以你可以更新你的观点。
这是场景,在我的应用程序中我有一个故事 post feature.While 创建一个 post,用户可以附加一个 photo.Then,我想要的是在用户从图库中选择照片后将照片上传到我的服务器,而不是在用户单击 post 按钮后。上传完成后回调将提供上传是否成功的信息。另外,如果有照片正在上传到服务器然后用户单击 post 按钮,所有正在上传的照片都将被取消。
伪代码
List tempList = [photoUri,photoUri,photoUri]
List attachedPhotoUriList.copyValue(tempList);
for each photoUri in tempList
uploadPhotoToServer(attachedPhotoUri,callback{
onSuccess:
attachedPhotoUriList.remove(photoUri)
onError:
})
问题: 我在哪里可以上传照片以便将其与主线程分离,然后 returns 如果照片上传成功或失败 activity 回调?可以取消吗?
在 AsyncTask 或服务中?虽然答案不仅限于这两个,你可以提出任何你认为合适的。
如果您使用 AsyncTask,则必须注意方向变化。对我来说这并不是最好的方式。
我认为使用服务更清洁。更具体的 IntentService.
此服务旨在在其自己的线程上处理一次性任务(正常服务在 UI 线程上运行)。您可以通过额外发送带有图像 Uri 的 Intent 来启动它。在 IntentService 中,您使用附加功能处理接收到的 Intent(从 Uri 上传图像)。完成后,您通过向 Activity 发送广播来通知您的 Activity(当然您必须为此注册一个侦听器)。一个很好的教程是 here. The official guide from Google is here.
一旦开始,您就不必注意方向的变化。
取消 IntentService 有点棘手,but can be done。但是也许你应该让它上传并在服务器端丢弃它,如果一段时间后没有合适的 post 上传(或其他一些机制)。
您的情况不需要带有 AIDL 的服务,因为 Activity 和服务 运行 在同一个进程中。
请记住,Service
默认在 UI 线程上运行,因此如果您使用它,您应该创建和管理自己的新 Thread
,这意味着更多行要维护的代码。 IntentService
在它自己的线程上运行,所以我更喜欢这个而不是 Service
和 AsyncTask
.
我的建议是使用像 retrofit which manages the connection details for you, if that's possible considering your project's requirements; In this tutorial 这样的第三方库,你可以看到如何将文件上传到服务器,改造会处理 UI 线程问题,做它外面的请求,并在其中返回响应,所以你可以更新你的观点。