我正在使用Square的磁带库将数据上传排队到服务器.
队列以JSON格式存储在File中.当应用程序启动时,我启动队列并开始上传(即如果在Wifi上)但是在用户的某些设备上我看到EOFException了'null'消息(登录崩溃).
FileObjectQueue从现有文件创建对象时发生错误- 从调试信息收集实际文件大约为1MB.
是什么导致了这个或如何防止它? - 也许我需要清理我的java.io.
编辑:使用Tape v1.2.1
Caused by: java.io.EOFException
at java.io.RandomAccessFile.readFully(RandomAccessFile.java:419)
at java.io.RandomAccessFile.readInt(RandomAccessFile.java:439)
at com.squareup.tape.QueueFile.readElement(:182)
at com.squareup.tape.QueueFile.readHeader(:162)
at com.squareup.tape.QueueFile.(:110)
at com.squareup.tape.FileObjectQueue.(:35)
at com.myapp.queue.MyUploadTaskQueue.create(:125)
Run Code Online (Sandbox Code Playgroud)
更新 - 自升级到1.2.2后也看到此错误
Caused by: java.io.IOException: File is corrupt; length stored in header is 0.
at com.squareup.tape.QueueFile.readHeader(:165)
at com.squareup.tape.QueueFile.<init>(:117)
at com.squareup.tape.FileObjectQueue.<init>(:35)
Run Code Online (Sandbox Code Playgroud) Square有一个开源项目名称Tape http://square.github.io/tape/,它实现了一个持久的文件支持队列.所有示例似乎都表明可以从主线程将对象添加到队列中.然而,android的所有其他最佳实践似乎表明在主线程上进行I/O只是在玩ANR的鸡.
Square Tape文件支持的队列是否设计为从主线程使用?如果是这样,是什么使得从主线程中使用它可靠安全而不用担心ANR与任何其他形式的I/O?
我正在构建一个健身应用程序,它不断记录设备上的活动.我需要经常登录,但我也不想不必要地耗尽我的用户电池,这就是为什么我在考虑将网络呼叫一起批处理并在无线电处于活动状态时立即将它们全部发送,设备是连接到WiFi或正在充电.
我正在使用基于文件系统的方法来实现它.我首先坚持数据File- 最终我可能会使用Tape from Square来做到这一点 - 但这是我遇到第一个问题的地方.
我不断写新的日志数据File,但我还需要定期将所有记录的数据发送到我的后端.当发生这种情况时,我删除了内容File.现在的问题是如何防止这两种操作同时发生?当然,如果我尝试将日志数据写入到File其他进程正在读取File并尝试删除其内容的同时,它将导致问题.
我正在考虑使用一个IntentService基本上充当所有这些操作的队列.从那以后 - 至少我已经阅读了 - 在单个工作程序中按顺序执行IntentServices句柄,这些操作中的两个操作不应该同时发生,对吧?IntentThread
目前我想安排一个PeriodicTask将GcmNetworkManager负责将数据发送到服务器.有没有更好的方法来做这一切?