Java Android:将帖子排队,直到有连接

Java Android:将帖子排队,直到有连接,java,android,sdk,http-post,internet-connection,Java,Android,Sdk,Http Post,Internet Connection,嗨,这是一个非常简单的问题,但我怀疑是一个复杂的答案: 这叫做“矿井场景” 让我来解释一下:想象一个简单的场景,你必须制作一个应用程序,它可以在没有信号的情况下,甚至在矿井下发送到网页上 i、 e.如果没有连接,我如何尝试/排队提交事件(HTTPPOST),然后定期轮询队列(测试是否存在连接),直到事件触发 PS:请注意:这是关于“如何”的对话,而不是关于“错误”的对话,例如:同步性或重复记录或覆盖来自2个用户的数据等。 伪代码: try{ MyHttpFileUploader myupl

嗨,这是一个非常简单的问题,但我怀疑是一个复杂的答案:

这叫做“矿井场景”

让我来解释一下:想象一个简单的场景,你必须制作一个应用程序,它可以在没有信号的情况下,甚至在矿井下发送到网页上

i、 e.如果没有连接,我如何尝试/排队提交事件(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
}
试试看{
MyHttpFileUploader myupload=新建MyHttpFileUploader();
myupload.Start();
}
catch(InternetDownException ex){/这里是一个粗略的(因为我现在主要用c#编写代码,这与这个问题无关)半伪代码,主要点(线程)上有sun文档片段

创建一个类,该类可以访问扩展线程的async post方法中所需的任何变量

 class WorkerThread extends Thread {
     int someDataYouNeed;
     MyHttpFileUploader maybeAClassYouNeedToCommunicateWithAtEnd;
     boolean hasNotFinishedTask = true;
     WorkerThread(int someDataYouNeed, MyHttpFileUploader callBackClass) {
         this.someDataYouNeed = someDataYouNeed;
         this.maybeAClassYouNeedToCommunicateWithAtEnd = callBackClass;
     }

     public void run() {

         while(hasNotFinishedTask){
         //do your work in here 
         //Try contact network endpoint
         try{
             //do a network call and if it doesnt except
             hasNotFinishedWork = false
             //now callback to the class firing a method maybe (I just made one up)
             maybeAClassYouNeedToCommunicateWithAtEnd.Close();
         }catch(TheException ex){ //do nothing or log }
         if(hasNotFinishedTask){
              Thread.Sleep(60000);//retry every minute
            }
         }
     }
 }
//在异步任务失败时实例化线程

 WorkerThread worker = new WorkerThread(42, this);
 worker.start();
现在,正如我所说的——我假设您的应用程序正在智能手机上运行,并且可以被关闭……如果是这样的话,并且只要操作系统允许,您就可以选择保存状态的方式(当您创建WorkerThread时)例如,文件系统和WorkerThread实例化中的xml检查文件是否存在,并从关闭时留下的位置开始

关于a)点,尽管我的示例是邮件服务器,但它们都是不可用的网络端点

更新:

现在我假设它将是纯java(记住我是c#所以不经常在平台上),但在较新版本的java或android中似乎有异步泛型类型的简单示例

有关特定于平台的示例,请参阅或doa google search for Android multi-threading。一种方法是使用和触发尝试发送数据

这里有关于使用意图的更多信息,该意图可能由AlarmManager触发


这个线程上也有一些代码示例

愚蠢的问题,但您显然听说过线程(?)。生成一个线程来处理这个问题有什么问题(如果应用程序可能在完成之前关闭,那么您应该存储状态,并在应用程序启动时根据存储的状态恢复)。另外-您所说的“我如何”优雅地将“this”抛出到start方法中是什么意思?…您已经捕获了它…因此,要么处理异常(通过启动线程)http post已经是一个异步事件。这不是UI取消绑定。这是一个很好的post轮询,论坛中的示例中缺少很多。线程化或非线程化的post失败如果没有internet连接,则需要在“x”之后重试时间量和漂洗重复,直到成功。该工作流正是电子邮件用于发件箱的工作流。文本用于发送。漂洗重复,直到服务器确定。我不介意它是否仅在应用程序在UI线程中处于活动状态时漂洗/重复,或者它是否永远在后台轮询,而不考虑用户交互。在本例中gard一旦启动帖子,它与保存的实例状态或用户应用程序交互没有任何关系。我已经让线程完全按照您所说的去做——在邮件服务器恢复在线之前,通过邮件服务器轮询存储失败的发送尝试的联系表单——您的线程是典型的长时间运行的情况这是异步帖子的结尾,如果你需要进一步的行为,你必须提供回退。我相信你应该在帖子失败后使用线程。好的,但是a)它不是邮件服务器,而是Web服务器的http帖子b)如果你愿意分享你的一些代码,我想借用一下-care提交答案?c)线程不是真正意义上的点,而不是在OP之外消除ui线程的混乱。需要的是一个队列(根据定义,它不在ui线程中)在WorkerThread run方法中,您可以通过一个“事物”列表(即,您提供给WorkerThread构造函数的一个列表,可能是xml文件中的一个事物列表)进行操作当线程完成所有任务后-退出。我会给你分数-作为计时器的简单的sleep while循环,很好,很简单-但是我会回来链接我最后做的事情。我想看看你想出了什么其他策略:)谢谢Rod,我真诚地认为这需要是一个教程-一个关于“获取和缓存http”的教程json/images/content和一个用于队列发回json的函数..以“矿井”的方式正确完成,即让应用程序工作,并提醒连接已断..我正在为此努力..关于如何使连接独立于http事件的正确教程..考虑到java是“错误管理的”语言令人震惊的是,强大的力量没有为最终用户的编程而斗争萨格里德,我正在考虑做类似的事情。