好的,一段时间以来,我一直在研究解决此问题的最佳方法,所以让我为您分解一下我的需求和发现。
需求:
- 一个活动 [SendMsg] 组成一个消息正文,其中可能包括最多 5MB 的图像附件。
- 当用户发送此消息时,消息必须上传到我的服务器
- 此上传必须同步发生,因为我阻止用户使用该应用程序,直到它完成或失败
- 完成后,如果发送成功,则 SendMsg Activity 将被销毁 - 否则会显示错误对话框
- 考虑到任何手机旋转或主页按钮按下/电话等,上传和用户体验必须保持不变
这里的最后一个子弹原来是最难的。
发现:
我想过只在静态 AsyncTask 中完成工作,但我认为这对我不起作用 - 状态变得非常混乱,似乎我无法保证当应用程序在后台时操作系统不会杀死线程.
我决定使用一个服务,在该服务中创建它并从 Activity 绑定/取消绑定。该服务生成一个 AsyncTask,完成工作,然后根据其结果 (SUCCEED/FAIL) 向 Activity 发出信号。除了我的大消息之外,这个范例似乎工作正常。服务/活动通信消息通信不适用于编组如此大的有效负载。*注意:如果不清楚,当用户点击发送时,此表单数据和文件必须提供给服务。在某些情况下,这是从相机拍摄的图像,出于应用程序的目的,它不存在也不可能存在于磁盘上。
很明显,我想要的是某种共享内存存储,我可以在其中保存来自 Activity 的数据。然后 Activity 可以向 Service 发出信号,表明它可以继续并上传该数据。
这样的共享区域可以存在内存中吗?我可以从服务中获取应用程序对象并将数据存储在那里吗?
另一个问题出现在上传完成但没有活动绑定到服务时,但我想我可能已经解决了这个问题。请让我知道以下是否有意义:
- 服务完成上传
- 服务检查当前是否绑定了 Activity
- 如果是,则返回 Activity 通过其消息队列处理的错误消息
- 如果不是,则将返回代码存储在该共享内存区域中,并在那里标记一个布尔值
- 当一个客户端活动被创建/恢复时,它应该首先检查这个布尔值,看看这个过程是否已经完成。如果是这样,将 Message 发送到它自己的处理程序并像以前一样处理代码