3

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

这被称为“矿井场景”

让我解释一下:想象一个简单的场景,你必须制作一个可以 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
}
4

2 回答 2

2

这是一个粗略的(因为我现在主要用 c# 编写代码,它与问题无关)半伪代码,主要是 sun 文档片段(线程)

创建一个类,该类可以访问扩展 Thread 的异步 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)保存为即xml 在文件系统和 WorkerThread 实例化上检查文件是否存在并从它关闭时离开的位置开始。

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

更新:

现在我认为这将是直接的 java (记住我是 c#,所以不是经常在平台上),但似乎在较新版本的 java 或 android.. .

有关特定于 android 的多线程,请参阅此博客文章或 doa 谷歌搜索 Android 多线程以获取特定于平台的示例

于 2012-12-05T21:27:15.540 回答
0

一种方法是使用 IntentServiceAlarmManager来触发尝试发送数据。

这里有更多关于使用 Intents的信息,并且 Intent 可以由 AlarmManager 触发

这个线程上还有一些代码示例AlarmManager not working

于 2012-12-19T11:10:47.973 回答