我想为我的用户提供更好的离线用户体验,因此,我想构建一个Service
来存储所有POST
,DELETE
,PUT
( GET
没有意义,因为没有网络的GET
呼叫是缓存呼叫)请求用户离线并在用户获得互联网连接后立即将它们发送到服务器。我希望它是持久的:即使应用程序被杀死,也会发送数据,以免在缓存和服务器数据之间产生不一致。
我对Google Volley和Android Networking API非常熟悉 - >我知道如何检测没有网络,如何预取数据,缓存它们等等......
但这个主题是否有要点或图书馆?我知道最新的Facebook版本实现了这样一个系统,但我不知道他们是怎么做的(我的意思是,我知道它们正在使用Service
,但他们是如何做到的,不知道!)。有人对此有任何想法吗?
答案 0 :(得分:5)
您需要使用BroadcastReceiver来收听网络更改事件。使用以下操作在AndroidManifest.xml中定义broadcastReciver。
<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" />
NetworkBroadcastReceiver -
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();
}
}
只要您上网,就可以提出申请。
要缓存数据,我建议您解析服务器响应并将其保存在数据库中以供离线使用。每次成功请求时,都会将新数据保存在数据库中并丢弃旧数据。当用户启动应用程序时,首先从数据库加载数据然后触发Volley请求,如果请求成功,则在app中加载新数据,将其存储在数据库中并删除旧数据。因此,如果请求失败,用户仍然可以看到之前成功请求中的旧数据。
要处理应用和服务器中数据之间的不一致,您需要使用SyncAdapter。 SyncAdapter为后台的定期同步提供了很好的支持。只需将同步代码放在SyncAdapter的onPerformSync()方法中即可。它可能不适用于以下两种情况 - 1.如果用户未连接到互联网 2.如果用户设备已关闭
要处理这些情况,请在我的答案中使用我在上面解释的BroadCastReceiver来触发SyncAdapter。还要在AndroidManifest.xml中向接收器添加以下操作,以侦听设备的启动完成事件。
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
如果您需要使用编码示例进行更深入的解释,请告诉我。希望它有所帮助
答案 1 :(得分:0)
您可能会采用网络验证方法:
1.检查网络连接
YES:
a)提出截击请求
b)从凌空请求中解析适配器
c)并将json保存到私人文件中
不:
a)读取私人文件
b)从json文件下载适配器。
**********************例如
if(isconnect){
JsonArrayRequest Req = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {
public void onResponse(JSONArray response) {
//this the request of your http request
Log.d(TAG, response.toString());
// Parsing json
for (int i = 0; i < response.length(); i++) {
try {
......adapter etc etc
}
adapter.notifyDataSetChanged();
//here write the httprequest (json file) in local memory
try {
String textjson= response.toString();
fos = context.openFileOutput("request.json",MODE_PRIVATE);
fos.write(textjson.getBytes("ISO-8859-1")); //encode
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
swipeRefreshLayout.setRefreshing(false);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// VolleyLog.d(TAG, "Error: " + error.getMessage());
} }); AppController.getInstance().addToRequestQueue(movieReq);
}
else{
//noconnection();
in the noconnection method u can parse the listview/recyclerview from json file to make the offline mode }
}else{
//parse the listview/recyclerview from local file. }