Android 安卓离线截击请求

Android 安卓离线截击请求,android,caching,android-volley,Android,Caching,Android Volley,我想给我的用户一个更好的离线用户体验,因此,我想建立一个服务,它存储所有POST,DELETE,PUT(GET毫无意义,因为没有网络的GET调用是缓存调用)用户脱机执行的请求,并在用户连接到internet后立即将其发送到服务器。我希望它是持久的:即使应用程序被终止,数据也会被发送,以避免缓存和服务器数据之间的不一致 我非常熟悉Google Volley和Android Networking API-->我知道如何检测没有网络,如何预取数据,如何缓存数据等等 但是,关于这个主题有什么要点或图书馆

我想给我的用户一个更好的离线用户体验,因此,我想建立一个
服务
,它存储所有
POST
DELETE
PUT
GET
毫无意义,因为没有网络的
GET
调用是缓存调用)用户脱机执行的请求,并在用户连接到internet后立即将其发送到服务器。我希望它是持久的:即使应用程序被终止,数据也会被发送,以避免缓存和服务器数据之间的不一致

我非常熟悉Google Volley和Android Networking API-->我知道如何检测没有网络,如何预取数据,如何缓存数据等等


但是,关于这个主题有什么要点或图书馆吗?我知道最新的Facebook版本实现了这样一个系统,但我想知道他们是怎么做到的(我的意思是,我知道有人在使用
服务
,但他们到底是怎么做到的,我不知道!)。有人对此有想法吗?有经验吗?

您可以使用网络验证方法:
1.检查网络连接
是:
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. }
如果(断开连接){
JsonArrayRequest Req=新的JsonArrayRequest(url,
新的Response.Listener(){
公共void onResponse(JSONArray响应){
//这是您的http请求的请求
Log.d(TAG,response.toString());
//解析json
对于(int i=0;i
您需要使用广播接收器收听网络更改事件。使用以下操作在AndroidManifest.xml中定义BroadcastReceiver

<receiver android:name=".NetworkBroadcastReceiver" >
     <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
     </intent-filter>
</receiver>
这就是你一上网就提出请求所需要做的一切

要缓存数据,我建议您解析服务器响应并将其保存在数据库中以供脱机使用。每次成功请求时,请将新数据保存在数据库中,并丢弃旧数据。当用户启动应用程序时,首先从数据库加载数据,然后触发截击请求,如果请求成功,则在应用程序中加载新数据,将其存储在数据库中,并清除旧数据。所以,若请求失败,用户仍然能够看到以前成功请求中的旧数据

若要处理应用程序和服务器中的数据之间的不一致,您需要使用SyncAdapter。SyncAdapter提供了对后台定期同步的强大支持。只需将同步代码放入SyncAdapter的onPerformSync()方法中。它可能在以下两种情况下不起作用- 1.如果用户未连接到internet 2.如果用户设备已关闭

要处理这些场景,请使用我在上面的回答中解释的BroadCastReceiver来触发SyncAdapter。还要将以下操作添加到AndroidManifest.xml中的接收器,以侦听设备的引导完成事件

<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />


让我知道,如果你需要更深入的解释与编码的例子。希望有帮助

看看我遇到的这个库-

您可以将后台任务定义为作业,并将其排入您的任务队列 JobManager实例。工作经理将负责优先顺序, 持久性、负载平衡、延迟、网络控制、分组等。 它还为您的工作提供了一个良好的生命周期,以提供更好的, 一致的用户体验


此外,它们还监视网络连接。当设备脱机时,需要网络连接的作业在恢复网络连接之前不会运行。

关于持久性服务,您读过yetYes吗,我读过,但我想知道是否有不太通用的内容:)您可以查看库。。。它使用服务向服务器发送请求,如果应用程序脱机,您可以从缓存中获取数据。但我认为当你退出应用程序时,服务就被破坏了。希望它能帮上忙…你找过SyncAdapter吗?那可以完成任务,这是真的,似乎有些过分,但最后,这可能是最好的方法,我看,我会看一看,因为我几乎写了这个库来满足这个需要#愚蠢的Thx伴侣
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();
    }    
}
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />