【发布时间】:2012-12-05 12:21:51
【问题描述】:
您好,这是一个非常简单的问题,但我怀疑这是一个复杂的答案:
这就是所谓的“矿井场景”
让我解释一下:想象一个简单的场景,您必须制作一个可以 httppost 到网页的应用程序,即使在没有信号的矿井下也是如此。
即如果没有连接,我如何尝试/排队提交事件 (HTTPPOST),然后定期轮询队列(测试是否存在连接)直到事件可以触发。
PS:请注意:请这是关于“如何”而不是关于“错误”的对话,回复:同步性或重复记录或覆盖来自 2 个用户的数据等。
伪代码:
try{
MyHttpFileUploader myupload = new MyHttpFileUploader();
myupload.Start();
}
catch (InternetDownException ex){ //<-- how do I "throw" this in the start method gracefully?
GlobalQueue.Add(myupload); //<-- how do i set a timer properly that can action this queue (.Start() method) and post messages "when complete" to toast on the main ui thread but otherwise not block the ui whatsoever
}
【问题讨论】:
-
愚蠢的问题,但您显然听说过线程(?)。产生一个线程来处理这个问题有什么问题(如果应用程序可能在完成之前关闭,那么您应该存储状态并根据存储的状态在应用程序启动时恢复)。另外 - “我如何优雅地在 start 方法中“抛出”它是什么意思?......你已经抓住了它......所以要么处理异常(通过启动线程)或重新抛出它以后再抓)
-
http 帖子已经是一个异步事件。这不是 UI 调试。这是一个很好的帖子民意调查,论坛中的示例中缺少很多。如果没有互联网连接,帖子是否会失败,这不需要失败,而是在“x”时间后重试并重复冲洗直到成功。工作流程正是电子邮件用于其发件箱的工作流程。文本用于发送。从服务器重复冲洗直到确定。我不介意它是否只在应用程序在 UI 线程中处于活动状态时冲洗/重复,或者无论用户交互如何,它是否都会在后台永久轮询。
-
在这方面,它与保存的实例状态或用户应用程序在发起帖子后的交互没有任何关系。
-
我已经使线程完全按照您所说的进行 - 联系表单存储通过邮件服务器轮询发送的失败尝试,直到邮件服务器重新联机 - 您的情况是典型的长时间运行的线程情况。帖子是否是异步的,除非它是异步帖子的结尾,如果您需要进一步的行为,您必须提供回退。我相信一旦帖子失败,您应该使用线程。
-
好的,但是 a) 它不是一个邮件服务器,它是一个发送到网络服务器的 http 帖子 b) 如果你愿意分享你的一些代码,我很乐意借用它 - 小心提交一个答案?和 c) 线程不是真正除了整理 OP 之外的 ui 线程之外的点。需要的是一个重试直到完成的队列(即,根据定义不在 ui 线程中)
标签: java android sdk http-post internet-connection