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

我正在使用电子邮件function的Android应用程序。 我希望我的用户能够在飞行模式下撰写和发送电子邮件。 为此,我需要一些排队,可以检查是否有networking和发送等。我的形象,这一定是做了100多次。 但我不确定为什么我的search没有太多的东西。 有谁知道一个库或git项目,我可以用来完成这个? 如果没有,有谁知道如何做到这一点?

我相信它被称为Queue and send pattern

更新

我在这个问题上开始赏金。 我希望是一个不使用SMS的工作示例。 对于我的特殊情况,我正在开发一个Appengine Connected Android项目。 客户端需要发送数据(string,位图等,在一个特定的POJO说狗)到服务器。 我想能够以某种方式排队这些数据。 我可以使用Gson将数据保存到文件等。底线是,我需要能够检查networking。 当有networking时,我将我的队列出队到服务器。 如果没有networking,我一直保存到队列中。

我的队列可以是Queue<Dog> ,其中Dog是我的类,具有诸如Bitmap (或图像path), Stringlong等字段。

我正在寻找一个工作的例子。 这可能非常简单,但这个例子必须工作。 一个git zip会很好。 我为这个问题放弃了近一半的观点。

 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 

Solutions Collecting From Web of "如何排队在android上的服务器调度数据"

首先,你需要设置一个接收器来观看无线连接,看看他们有没有数据,你也可以检查正常的3G / 4G连接,并为此做一个广播接收器。 这使得使用一个广播接收器来实现连接状态的改变。 把这样的东西放在应用程序标签的清单中

 <receiver android:name=".NetworkChangeReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver> 

现在我们需要使清单中定义的接收者

 public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //here, check that the network connection is available. If yes, start your email service. If not, stop your email service. ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = cm.getActiveNetworkInfo(); if (info != null) { if (info.isConnected()) { //start service Intent intent = new Intent(this, ItemServiceManager.class); startService(intent); } else { //stop service Intent intent = new Intent(this, ItemServiceManager.class); stopService(intent); } } } } 

这样做是在android land中放置一个叫做NetworkChangeReceiver的大型天线,当android对于数据连接状态的改变有些话的时候,这是很好的聆听。

现在你需要build立你的ItemServiceManager.class ,它应该从数据库中读取(它也应该扩展Service ,它应该select数据库中最老的项目(发邮件,文本,上传到服务器,不pipe),如果连接成功,然后从数据库中删除项目,并加载下一个最旧的一个。如果没有更多,然后closures服务和广播接收机。

如果您有连接并且用户需要发送更多数据,请将其添加到数据库,然后确保服务已启动。 也许通知它,它应该再次检查数据库(几秒钟之后),然后决定它可以closures,因为什么都没有。

这就是你可能会禁用你的广播接收器。

 PackageManager packageManager = context.getPackageManager(); ComponentName componentName = new ComponentName(context, NetworkChangeReceiver.class); packageManager.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 

当一个新的项目上传时,如果没有networking连接,电子邮件应该被保存到数据库,广播接收机应该知道互联网何时回来,以便知道何时上传。 你可以像这样启动它。

 PackageManager packageManager = context.getPackageManager(); ComponentName componentName = new ComponentName(context, NetworkChangeReceiver.class); packageManager.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP); 

关键是你只关心连接广播,当你有一些存储上传但不能上传,因为没有数据连接。 当你没有什么需要上传的时候,不要浪费处理器和电池,因为你要保持你的接收器/服务。 而当你有电子邮件等待,然后启动broadcastreceiver,知道你有数据连接,以便您可以开始上传。

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

编辑:

你可以做的另一件事是让服务器允许你接受一系列的项目,这样你就可以一次上传它,当你有一个有效的连接。 一般来说,如果每件产品体积都很小,就可以做到这一点。 但是,如果你正在上传图片或video或任何大,最好一次一个一个地做。