Заявка на Android с волейболом

Я хочу, чтобы мой пользователь стал намного лучше автономным пользователем, поэтому я хочу построить Service, который хранит все POST, DELETE, PUT (GET не имеет смысла, потому что GET вызов без сети - это вызов кэш), запрашивает пользователя в автономном режиме и отправляет его на сервер, как только пользователь получит подключение к Интернету. Я хочу, чтобы он был постоянным: даже если приложение было убито, данные отправляются, чтобы не иметь противоречий между данными кэша и сервера.

Я хорошо знаком с Google Volley и Android Networking API → Я знаю, как определить, нет ли сети, как предварительно очистить данные, кэшировать их и т.д.

Но есть ли сущность или библиотека об этом предмете? Я знаю, что последняя версия Facebook реализует такую ​​систему, но мне интересно, как они это сделали (я имею в виду, я знаю, что они используют Service, но как они это сделали, понятия не имели!). У кого-то есть идея по этому поводу, любой опыт?

Ответы

Ответ 1

Вам необходимо использовать BroadcastReceiver для прослушивания событий изменения сети. Определите broadcastReciver в вашем AndroidManifest.xml со следующим действием.

<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, если запрос станет успешным, загрузите новые данные в приложение, сохраните его в базе данных и избавьтесь от старого. Поэтому в случае сбоя запроса пользователь все равно сможет видеть старые данные с предыдущего успешного запроса.

Чтобы обрабатывать несогласованность между данными в приложении и сервере, вам необходимо использовать SyncAdapter. SyncAdapter обеспечивает отличную поддержку периодической синхронизации в фоновом режиме. Просто поставьте синхронизирующий код в onPerformSync() метод SyncAdapter. Возможно, это не сработает в следующих двух сценариях: 1. Если пользователь не подключен к Интернету 2. Если пользовательское устройство выключено

Чтобы справиться с этим сценарием, используйте BroadCastReceiver, который я объяснил выше в своем ответе, чтобы запустить SyncAdapter. Также добавьте следующие действия в ваш приемник внутри AndroidManifest.xml, чтобы прослушать событие завершения загрузки устройства.

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

Сообщите мне, если вам нужно более подробное объяснение с примером кодирования. Надеюсь, что это поможет.

Ответ 2

Взгляните на эту библиотеку, с которой я столкнулся - Очередность приоритетов Android.

Вы определяете свои фоновые задачи как "Задания" и ставите их в очередь Экземпляр JobManager. Менеджер заданий позаботится о приоритизации, сохранение, балансировка нагрузки, задержка, управление сетью, группировка и т.д. Он также обеспечивает хороший жизненный цикл для ваших рабочих мест, чтобы обеспечить лучшее, постоянный пользовательский интерфейс.

Кроме того, они контролируют сетевое подключение. Когда устройство отключено, задания, требующие сетевого подключения, не будут выполняться до восстановления сетевого подключения.

Ответ 3

возможно, вы используете метод проверки сети:
1. проверить сетевое подключение
 ДА:
      a) сделать запрос на волейбол
      б) разобрать адаптер из запроса волейбола
      c) и сохраните json в личный файл

 НЕТ:
      а) прочитать частный файл
      б) сделать адаптер из загруженного 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. }