在Android中有效缓存上传的数据

在Android中有效缓存上传的数据,android,Android,我已经在Android中实现了一个队列服务,它将根据队列和wifi/数据连接事件改变状态 我将要发布到远程url的事务排队。如果设备有数据或wifi连接,它将迭代队列并将数据发布到url,直到队列为空,或者出现断开连接事件 我可以登录到我的应用程序,启用飞机模式,生成数据,关闭飞机模式,然后发布交易。即使有数千笔交易,也不会减速。(我试着把它弄小) 进入:低接收! 当3G接收信号很低时,我的应用程序速度会大大减慢。(是的,所有的上传都是在ui线程之外进行的。)看来,这种速度减慢的原因与向服务器发

我已经在Android中实现了一个队列服务,它将根据队列和wifi/数据连接事件改变状态

我将要发布到远程url的事务排队。如果设备有数据或wifi连接,它将迭代队列并将数据发布到url,直到队列为空,或者出现断开连接事件

我可以登录到我的应用程序,启用飞机模式,生成数据,关闭飞机模式,然后发布交易。即使有数千笔交易,也不会减速。(我试着把它弄小)

进入:低接收! 当3G接收信号很低时,我的应用程序速度会大大减慢。(是的,所有的上传都是在ui线程之外进行的。)看来,这种速度减慢的原因与向服务器发送邮件需要很长时间,有时甚至失败有关


我的问题是,我如何解决这个问题?检查信号质量?找一个已知的地址?Gmail等其他应用程序如何解决这个问题?这一定是常见的情况

如果您可能有数千个任务都需要执行,那么它们肯定应该得到管理。你有没有想过实现你自己的?文档非常好,课程也很容易理解,但如果您需要示例,请尝试以下网站:


这样做的好处是,您可以限制正在生成的线程的最大数量,因此,如果您将线程数限制在合理的数量(对于Android,我建议不要超过20个),您不应该在系统范围内降低速度。

是否可以对套接字和会话超时进行一些微调?因此,如果您的连接速度慢且已暂停,则会发生超时,传输将失败

连接/发送失败后,您可以稍后重试传输或执行其他操作

要调整超时,可以使用以下代码:

HttpParams httpParameters = new BasicHttpParams();

HttpConnectionParams.setConnectionTimeout(httpParameters, 30 * 1000);
HttpConnectionParams.setSoTimeout(httpParameters, 15 * 1000);

HttpClient client =  DefaultHttpClient(httpParameters);
// use client...

我们的申请也有类似的情况。我们认为信号问题是一个现实,并且随时可能发生。我们要遵循的一点是,除非我们从服务器获得功能确认,并仅基于http状态代码,否则不会从设备中删除任何内容。在网络速度缓慢或可能突然失去信号的情况下,尽管我们可能已经发布了内容,但在许多情况下,数据仅部分接收。所以我们决定通过某种方式让服务器知道设备(通过设备发出的一些基于http get的请求调用的结果)已经收到了内容。
除了性能或检查网络(您提出的问题)之外,我们还需要这样的行为来保证应用程序的健壮性。

您应该使用HTTP范围头进行检查,例如


服务器应在读取时将有效负载写入磁盘,并处理断开连接。客户机无法知道实际到达服务器的有效负载有多少字节,因此每次出现网络错误时,它都需要与服务器同步。不要忘记处理电池和用户问题;-)

如果您想等待更好的信号,那么您需要的可能是该类及其getCdmaDbm、getEvdoDbm和getGsmSignalStrength方法

看看这个:


先进的编码技巧和技巧、节省带宽的技术、实现模式、接触一些鲜为人知的API功能,以及了解如何通过确保您的应用程序是运营商网络上的好公民来最大限度地减少电池消耗。

您当然需要为以下情况制定计划:“连接存在,但服务器速度慢、无法访问等”有两个想法:1.保留缓存,定义一个您可以接受的最大大小(意思是:当缓存已满时,您不关心事件是否被丢弃).2.测量一个请求所需的时间。如果时间大于生成事件所需的时间,请暂停更长的时间以加载连接或服务器。我没有并行执行上载。一次仅发生一次上载。是的,上载队列与“主”队列处于单独的进程中“应用程序,但是,一次只能上载一个。我误解你的建议了吗?如果你一次只执行一个任务,而任务是在后台运行的,为什么会减慢你的UI速度?或者这就是百万美元的问题吗?:)