Java 如何在android上为服务器调度排队数据

Java 如何在android上为服务器调度排队数据,java,android,networking,client-server,Java,Android,Networking,Client Server,我正在开发一款带有电子邮件功能的android应用程序。我希望我的用户能够在飞行模式下撰写和发送电子邮件。为此,我需要一些队列,可以检查是否有网络和发送等排序。我的形象,这必须已经做了100次。但我真的不知道为什么我的搜索结果不多。有人知道我可以用一个库或git项目来完成这个任务吗?如果没有,有人知道如何做到这一点吗 我相信它被称为队列和发送模式 更新 我开始悬赏这个问题。我所希望的是一个不使用SMS的工作示例。就我的特殊情况而言,我正在从事一个与Appengine连接的Android项目。客户

我正在开发一款带有电子邮件功能的android应用程序。我希望我的用户能够在飞行模式下撰写和发送电子邮件。为此,我需要一些队列,可以检查是否有网络和发送等排序。我的形象,这必须已经做了100次。但我真的不知道为什么我的搜索结果不多。有人知道我可以用一个库或git项目来完成这个任务吗?如果没有,有人知道如何做到这一点吗

我相信它被称为
队列和发送模式

更新

我开始悬赏这个问题。我所希望的是一个不使用SMS的工作示例。就我的特殊情况而言,我正在从事一个与Appengine连接的Android项目。客户端需要向服务器发送数据(特定POJO下的字符串、位图等)。我希望能够以某种方式将这些数据排队。我可以使用Gson将数据保存到文件等。底线是我需要能够检查网络。当有网络时,我将队列排入服务器。如果没有网络,我会一直保存到队列中

我的队列可以是
queue
,其中
Dog
是我的类,带有
Bitmap
(或图像路径)、
String
long
等字段

我正在寻找一个有效的例子。它可能非常简单,但示例必须有效。git拉链就好了。对于这个问题,我放弃了将近一半的观点。

class Dog{
   String dogname;
   String pathToImage;
   int dogAge;
   //etc.
}

//Design pattern for sending Dog to server
0) Unmarshall queue from file using Gson
1) Add dog to queue
2) If there is network, loop through queue and send data to server
3) if there is no network save queue to file

//Ideally, as soon as there is network, the method should be able to detect so and run to send data to server

首先,您需要设置一个接收器来观看wifi连接,以查看他们何时有数据,您还可以检查正常的3g/4g连接,并为此制作一个广播接收器。要执行此操作,请使用实现广播接收器以更改连接状态。在应用程序标记的清单中放入类似的内容

<receiver android:name=".NetworkChangeReceiver" >
       <intent-filter>
           <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
       </intent-filter>
</receiver>
这样做的目的是在安卓陆地上安装一个名为
networkchangerecever
的大天线,当安卓对数据连接状态的变化有意见时,它会被微调以监听

现在,您需要构建您的
ItemServiceManager.class
,它应该从数据库中读取(它还应该扩展
Service
。它应该选择数据库中最旧的项目,(通过电子邮件发送、发送文本、上传到服务器,等等),如果连接成功,则从数据库中删除该项目,并加载下一个最旧的项目。如果没有,则关闭服务和广播接收器

PackageManager packageManager  = context.getPackageManager();
ComponentName componentName = new ComponentName(context, NetworkChangeReceiver.class);
        packageManager.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
如果您有连接,并且用户需要发送更多数据,则将其添加到数据库中,然后确保服务已启动。可能会通知它在决定是否可以关闭数据库之前(几秒钟后),应再次检查数据库,因为数据库中没有任何内容

这是您禁用广播接收器的方式

PackageManager packageManager  = context.getPackageManager();
ComponentName componentName = new ComponentName(context, NetworkChangeReceiver.class);
        packageManager.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
在上载新项目时,如果没有web连接,则应将电子邮件保存到数据库中,并启动广播接收器以了解internet何时恢复,以便它知道何时上载。您可以这样启动它

PackageManager packageManager  = context.getPackageManager();
ComponentName componentName = new ComponentName(context, NetworkChangeReceiver.class);
        packageManager.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
关键是,当你存储了要上传的东西,但由于没有数据连接而无法上传时,你只关心连接广播。当你没有东西要上传时,不要浪费处理和电池,让你的接收器/服务留在身边。当你有电子邮件等待时,启动你的广播接收器,以知道何时有数据连接,以便开始上传

我不认为有人会为你写一个完整的工作解决方案,希望这足以让你走上正轨

编辑:


你可以做的另一件事是,让服务器允许接受你的一系列项目,这样你就可以在获得有效连接时一次上传所有项目。通常,如果每个项目都非常小,你会这样做。但是如果你上传图片、视频或任何大的项目,最好一次上传一个。

@EJP我知道exac正如我的伪代码所示,我不太擅长android处理程序和网络检查,所以我请求帮助(因为我怀疑答案涉及处理程序)。我不需要有人来解决我的确切问题。但我也不想要一大堆毫无帮助的含糊答案,因此我制定了标准。工作示例不必解决我的特定问题;它只需解决问题的要点:即如何为服务器调度排队数据。您不需要设置标准。因此,设置标准。发布你的代码。你可以查看路径。通过一些配置,你应该能够使用它来实现你想要的。谢谢@corsair992,这看起来确实是我需要的。我会更深入地研究它并实现它,然后让你知道。谢谢。哈哈,我喜欢看Katedral Pillon声誉变化的历史。毕竟,不太好但是这是公平的:在stackoverflow上帮助人们需要时间。我为延迟接受您的答案而道歉,与@corsair992的答案相比。我一直在项目的其他部分工作,应该很快回到这个困难的部分。谢谢你花时间帮助一个陌生人。奖金是200分,为什么你只得到100分?我不明白为什么。@KatedralPillon如果OP不接受答案,并且在时间到期时由于是得票最多的答案而自动选择,则回答的用户将获得1/2分。