我想给我的用户一个更好的离线用户体验,因此,我想建立一个Service
来存储所有POST
,DELETE
,PUT
(GET
毫无意义,因为没有网络的GET
调用是一个缓存调用)请求用户离线,并在用户获得实习生后立即将其发送到服务器ET连接。我希望它是持久的:即使应用程序被终止,数据也会被发送,以避免缓存和服务器数据之间的不一致。
我非常熟悉google volley和android networking api-->我知道如何检测没有网络,如何预取数据,如何缓存它们等等……
但是关于这个问题有什么要旨或图书馆吗?我知道最新的facebook版本实现了这样一个系统,但我想知道他们是怎么做到的(我的意思是,我知道有人在使用Service
但他们到底是怎么做到的,不知道!)有人对此有想法,有经验吗?
最佳答案
您需要使用广播接收器来侦听网络更改事件。使用以下操作在AndroidManifest.xml中定义BroadcastReceiver。
<receiver android:name=".NetworkBroadcastReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
还将以下权限添加到清单文件中-
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
网络广播接收机-
public class NetworkBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
if(isInternetConnected(context)) {
//Do something i.e. trigger an API call or start a IntentService etc.
}
}
public boolean isInternetConnected(Context context) {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
}
你只要上网就可以提出要求。
为了缓存数据,我建议您解析服务器响应并将其保存在数据库中供脱机使用。每次成功请求时,请将新数据保存到数据库中并丢弃旧数据。当用户启动应用程序时,首先从数据库加载数据,然后触发截击请求,如果请求成功,则在应用程序中加载新数据,将其存储在数据库中,并删除旧数据。因此,如果请求失败,用户仍然可以看到以前成功请求的旧数据。
要处理应用程序和服务器中的数据之间的不一致,需要使用SyncAdapter。SyncAdapter为后台的定期同步提供了强大的支持。只需将同步代码放入syncadapter的onperformsync()方法中。在以下两种情况下可能不起作用-
1。如果用户未连接到Internet
2。如果用户设备关闭
要处理这些场景,请使用我在回答中解释的广播接收器来触发syncadapter。还要在androidmanifest.xml中向接收器添加以下操作,以侦听设备的引导完成事件。
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
如果您需要更深入的解释和编码示例,请告诉我。希望有帮助