WorkManager startWork () никогда не вызывает при соблюдении ограничений - PullRequest
0 голосов
/ 13 июля 2020

Я хочу, чтобы WorkManager startWork () вызывался каждый раз, когда пользователь подключается к Inte rnet через Wi-Fi или 3g / 4g / 5g.

Он вызывает только один раз в начале, когда я регистрируюсь это.

работа в очереди, когда пользователь входит в систему.

Worker.startWorkManager(SignInActivity.this);
startActivity(new Intent(SignInActivity.this,UsersActivity.class);

он никогда не вызывает снова, когда пользователь выключает и снова включает Wi-Fi, независимо от того, находится ли приложение на переднем плане или фон или приложение убито из последних приложений.

Я хочу, чтобы он вызывался каждый раз, когда пользователь выключает и включает Wi-Fi в каждом сценарии, т.е. передний план, фон или приложение убито.

Worker.class

public class Worker {
    public Worker(Context context, WorkerParameters workerParams) {
    }

    public static void startWorkManager(Context context) {
        Constraints constraints = new Constraints.Builder()
                .setRequiredNetworkType(NetworkType.CONNECTED)
                .build();

        WorkManager.getInstance(context).enqueueUniqueWork(Constants.TAG_SYNC_DATA, ExistingWorkPolicy.KEEP, new OneTimeWorkRequest.Builder(SyncDataWorker.class)
                .addTag(Constants.TAG_SYNC_DATA)
                .setConstraints(constraints)
                .build());
    }
}

SyncDataWorker.class

public class SyncDataWorker extends ListenableWorker {


    public SyncDataWorker(
            @NonNull Context context,
            @NonNull WorkerParameters params) {
        super(context, params);
    }

    @NonNull
    @Override
    public ListenableFuture<Result> startWork() {
        return CallbackToFutureAdapter.getFuture(completer -> {
            AsyncCallback callback = new AsyncCallback() {
                @Override
                public void onFailure(Exception e) {
                    completer.setException(e);
                }

                @Override
                public void onSuccess() {
                    completer.set(Result.success());
                }

                @Override
                public void onRetry() {
                    completer.set(Result.retry());
                }
            };
            new AsyncSyncData(getApplicationContext(), callback).execute();
            return callback;
        });
    }
}

AsyncSynData.class

public class AsyncSyncData extends AsyncTask<Void, Void, Void> {
    private final Context context;

    ArrayList<message> messageArrayListNotSync;
    ArrayList<unread_messages> unreadMessagesArrayList;

    String user_id = "";
    private AsyncCallback callback = null;

    public AsyncSyncData(Context context, AsyncCallback callback) {
        this.context = context;
        messageArrayListNotSync = new ArrayList<>();
        unreadMessagesArrayList = new ArrayList<>();
        this.callback = callback;
    }

    @Override
    protected Void doInBackground(Void... voids) {
        AppDatabase db = AppDatabase.getAppDatabase(context);
        user user = null;
        ArrayList<user> userArrayList = new ArrayList<>(db.applicationDao().getAllUsers());
        if (userArrayList.size() > 0) {
            user = userArrayList.get(0);
        }
        messageArrayListNotSync = new ArrayList<>(db.applicationDao().getAllMessagesNotSync(!user_id.isEmpty() ? user_id : user.threadId));
        unreadMessagesArrayList = new ArrayList<>(db.applicationDao().getUnreadMessageStatus());

        System.out.println("messageArrayListNotSync: " + messageArrayListNotSync);
        System.out.println("unreadMessagesArrayList: " + unreadMessagesArrayList);

        try {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("user_id", !user_id.isEmpty() ? user_id : user.threadId);

            Gson gson = new GsonBuilder().create();
            JsonArray json_messages = gson.toJsonTree(messageArrayListNotSync).getAsJsonArray();
            JsonArray json_unread_messages = gson.toJsonTree(unreadMessagesArrayList).getAsJsonArray();

            jsonObject.put("messages", json_messages);
            jsonObject.put("unread_messages", json_unread_messages);


            RequestHandler.postRequest("/messages", jsonObject, context, new VolleyCallback() {
                @Override
                public void onSuccess(JSONObject result) {
                   
                    final JSONObject finalResult = result;
                    try {
                        if (result != null && result.has("success") && result.getBoolean("success")) {
                            new AsyncDeleteUnreadMessagesList(context, unreadMessagesArrayList, new Callback() {
                                @Override
                                public void onCallbackCompleted() {
                                    try {
                                        ArrayList<com.app.amber.internet.DATABASE_OPERATIONS.schema.message> messagesToStore = new ArrayList<>();
                                        JSONObject result = finalResult.getJSONObject("data");

                                        JSONObject last_messages = result.getJSONObject("last_messages");

                                        new AsyncUpdateLastMessage(context, last_messages, true, new Callback() {
                                            @Override
                                            public void onCallbackCompleted() {
                                                try {
                                                    JSONArray json_messages_to_store = result.getJSONArray("messages");
                                                    JSONArray json_evetns_type_1 = result.getJSONArray("eventsType1");
                                                    JSONArray json_evetns_type_2 = result.getJSONArray("eventsType2");

                                                    for (int i = 0; i < json_messages_to_store.length(); i++) {
                                                        JSONObject data = json_messages_to_store.getJSONObject(i);

                                                        String id = data.getString("id"),
                                                                sender_id = data.getString("sender_id"),
                                                                receiver_id = data.getString("receiver_id"),
                                                                msg = data.getString("msg"),
                                                                type = data.getString("type"),
                                                                path = data.getString("path"),
                                                                download_status = data.getString("download"),
                                                                group_users = data.getString("group_users"),
                                                                group_message_status = data.getString("group_message_status");

                                                        boolean is_sender = false;

                                                        long data_created = data.getLong("date_created");

                                                        int is_read = 0;

                                                        com.app.amber.internet.DATABASE_OPERATIONS.schema.message message =
                                                                new com.app.amber.internet.DATABASE_OPERATIONS.schema.message(id, sender_id, receiver_id, msg, type, path, is_sender, data_created,
                                                                        is_read, download_status, sender_id, group_users, group_message_status);
                                                        messagesToStore.add(message);
                                                    }

                                                    ArrayList<String> messageIdsType1 = new ArrayList<>();
                                                    ArrayList<String> messageIdsType2 = new ArrayList<>();

                                                    for (int i = 0; i < json_evetns_type_1.length(); i++) {
                                                        messageIdsType1.add(json_evetns_type_1.getJSONObject(i).getString("id"));
                                                    }

                                                    for (int i = 0; i < json_evetns_type_2.length(); i++) {
                                                        messageIdsType2.add(json_evetns_type_2.getJSONObject(i).getString("id"));
                                                    }

                                                    new AsyncStoreOldMessagesLocally(context, messagesToStore, new Callback() {
                                                        @Override
                                                        public void onCallbackCompleted() {

                                                            new AsyncUpdateMessageStatus(context, messageIdsType1, 1, new Callback() {
                                                                @Override
                                                                public void onCallbackCompleted() {

                                                                    new AsyncUpdateMessageStatus(context, messageIdsType2, 2, new Callback() {
                                                                        @Override
                                                                        public void onCallbackCompleted() {

                                                                            new AsyncUpdateMessageStatusList(context, messageArrayListNotSync, new Callback() {
                                                                                @Override
                                                                                public void onCallbackCompleted() {
                                                                                    sendCallBack();
                                                                                }
                                                                            }).execute();
                                                                        }
                                                                    }).execute();
                                                                }
                                                            }).execute();
                                                        }
                                                    }).execute();
                                                } catch (Exception e) {
                                                    System.out.println("Exception occurred while getting data from data JSONObject received from service: " + e.toString());
                                                    e.printStackTrace();
                                                    sendCallBack();
                                                }
                                            }
                                        }).execute();
                                    } catch (Exception e) {
                                        System.out.println("Exception occurred while parsing data JSONObject received from service: " + e.toString());
                                        e.printStackTrace();
                                        sendCallBack();
                                    }
                                }
                            }).execute();
                        } else {
                            sendCallBack();
                        }

                    } catch (Exception e) {
                        System.out.println("Exception occurred while parsing webservice result: " + e.toString());
                        sendCallBack();
                    }
                }
            });
        } catch (Exception e) {
            System.out.println("exception occurred while parsing messaging lists: " + e.toString());
            sendCallBack();
        }
        return null;
    }

    private void sendCallBack() {
        if (callback != null) {
            callback.onSuccess();
        }
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
    }
}

1 Ответ

0 голосов
/ 29 августа 2020

«WorkManager startWork () никогда не вызывает, когда выполняются ограничения» «Он вызывает только один раз в начале, когда я его регистрирую.»

ListenableWorker может быть воссоздан в некоторых ситуациях, новый экземпляр ListenableWorker с тем же первым ListenableWorker.id . Но для его воссоздания его нельзя закончить . Вот несколько ситуаций:

  1. Некоторые ограничения больше не совпадают, и они совпадают снова
  2. Система была перезагружена

Теперь вот несколько ситуаций, когда он будет завершен:

  1. Некоторое исключение было вызвано без обработки
  2. Completeter.set (Result.success ()) был вызван
  3. completer.set (Result. failure ()) был вызван

В вашем коде есть некоторые ситуации, когда воркер может быть завершен.

  1. Имеется много вызовов AsyncSyncData.sendCallBack , что может вызвать вызов completer.set (Result.success ()) в экземпляре ListenableWorker. Если это произойдет, ListenableWorker завершит задание, поэтому он не будет

«Я хочу, чтобы WorkManager startWork () вызывал каждый раз, когда пользователь подключается к Inte rnet через Wi-Fi или 3g / 4g / 5g.»

Только WorkManager не создаст новый экземпляр ListenableWork каждый раз, когда пользователь подключается к Inte rnet. WorkManager - это API для планирования задач, а ограничения, определенные в ListenableWork, используются, чтобы не запускать его, пока они не совпадают , после завершения ListenableWork, как обсуждалось выше, эта задача завершена, поэтому больше нечего делать.

Если вы хотите прослушать некоторые изменения подключения, вы должны использовать ConnectivityManager.registerNetworkCallback , а затем, когда пользователь подключается к, вы делаете то, что хотите. Вот примеры, которые могут вам в этом помочь.

...