使用Volley进行Android离线请求

Lau*_*yer 15 android caching android-volley

我想给我的用户提供了一个更好的线下的用户体验,因此,我想建立一个Service存储所有POST,DELETE,PUT(GET是没有意义的,因为GET没有网络呼叫是缓存调用)要求用户做下线,并将它们发送到用户获得互联网连接后立即服务器.我希望它是持久的:即使应用程序被杀死,也会发送数据,以免在缓存和服务器数据之间产生不一致.

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

但是有关于这个主题的要点或图书馆吗?我知道最新的Facebook版本实现了这样一个系统,但我不知道他们是怎么做的(我的意思是,我知道它们正在使用Service但它们是如何完成的,不知道!).有人对此有任何想法,有经验吗?

Var*_*oid 5

您需要使用BroadcastReceiver来侦听网络更改事件.使用以下操作在AndroidManifest.xml中定义broadcastReciver.

<receiver android:name=".NetworkBroadcastReceiver" >
     <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
     </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

还要将以下权限添加到清单文件中 -

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
Run Code Online (Sandbox Code Playgroud)

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();
    }    
}
Run Code Online (Sandbox Code Playgroud)

这就是您在上网后立即提出请求所需要做的一切.

要缓存数据,我建议您解析服务器响应并将其保存在数据库中以供离线使用.每次成功请求时,都会将新数据保存在数据库中并丢弃旧数据.当用户启动应用程序时,首先从数据库加载数据然后触发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" />
Run Code Online (Sandbox Code Playgroud)

如果您需要使用编码示例进行更深入的解释,请告诉我.希望能帮助到你


小智 0

你也许会做一个网络验证方法:
1.检查网络连接
是:
a) 发出 volley 请求
b) 从 volley 请求解析适配器
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. }
Run Code Online (Sandbox Code Playgroud)