Kat*_*lon 7 java networking android client-server
我正在开发一个带有电子邮件功能的Android应用程序.我希望我的用户能够在飞行模式下撰写和发送电子邮件.为此,我需要某种队列,可以检查是否有网络和发送等.我想这已经完成了100次.但我不确定为什么我的搜索量不会太多.有谁知道我可以用来完成这个的库或git项目?如果没有,有谁知道如何做到这一点?
我相信它被称为Queue and send pattern.
更新
我正在就这个问题开始赏金.我希望的是一个不使用SMS的工作示例.对于我的特殊情况,我正在开发一个Appengine Connected Android项目.客户端需要将数据(字符串,位图等在特定的POJO下称为Dog)发送到服务器.我希望能够以某种方式排队这些数据.我可以使用Gson将数据保存到文件等.最重要的是我需要能够检查网络.当有网络时,我将队列出列到服务器.如果没有网络,我会一直保存到队列中.
我的队列可以是Queue<Dog>,这里Dog是我的类字段,诸如Bitmap(或路径图像), String,long等等.
我正在寻找一个有效的例子.它可以非常简单,但示例必须有效.一个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
Run Code Online (Sandbox Code Playgroud)
WIl*_*JBD 10
首先,你需要设置一个接收器观看WiFi连接时看到他们的数据,你也可以检查正常的3G/4G连接,并为广播接收器,以及.TODO这让使用者实现对连接状态变化的广播接收器.把这样的事情在清单中的应用程序标签
<receiver android:name=".NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
现在我们需要制作清单中定义的接收器
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样做是把所谓的一个大胖子天线NetworkChangeReceiverandroid的土地出来,那是微调,以监听当Android有话要说在数据连接状态的变化上.
现在你需要建立你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);
Run Code Online (Sandbox Code Playgroud)
当一个新产品要上载,如果没有网络连接,电子邮件应保存到数据库与广播接收机应开始知道什么时候互联网回来,因此它可以知道什么时候上传.你可能会启动它是这样的.
PackageManager packageManager = context.getPackageManager();
ComponentName componentName = new ComponentName(context, NetworkChangeReceiver.class);
packageManager.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
Run Code Online (Sandbox Code Playgroud)
整点是,你只在乎连接广播,当你有存储的东西上传,但不能把它上传,因为没有数据连接.当您无需上传任何内容时,请不要通过保持接收器/服务来浪费处理和电池.当你有电子邮件等待,然后启动你broadcastreceiver,知道什么时候你有数据连接,这样你就可以开始上传.
我不认为任何人会写一个整体的工作为你解决,希望这是绰绰有余,让你对你的方式.
编辑:
你可以做的另一件事,是让服务器允许接受你的项目的数组,这样你可以把它上传一次全部,当你得到一个有效的连接.一般来说,如果每个项目都相当小,你会这样做.但是,如果您上传的图片或视频或任何大,最好做一次一个大概.
| 归档时间: |
|
| 查看次数: |
2316 次 |
| 最近记录: |