满足约束时,WorkManager startWork()永远不会调用

时间:2020-07-13 16:18:06

标签: android android-workmanager android-jobscheduler

我希望每次用户通过wifi或3g / 4g / 5g连接到Internet时都调用WorkManager startWork()。

在我注册它的开头,它仅调用一次。

用户登录时使工作排队。

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

无论用户处于前台还是后台,或者通过从最近使用的应用程序刷杀而杀死应用程序,只要用户再次关闭和打开Wifi,它就不会再调用。

我希望在每种情况下(即前景,背景或应用被杀死),用户每次关闭和打开Wifi时都可以调用它。

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 :(得分:0)

“满足约束条件时,WorkManager startWork()从不调用”
“它在我注册时一开始只调用一次。”

在某些情况下,可以重新创建 ListenableWorker 一个新的ListenableWorker实例,并且具有相同的第一个ListenableWorker.id 强>。但是要重新创建,无法完成。这是一些情况:

  1. 某些约束不再匹配,并且再次匹配
  2. 系统已重新启动

现在,在某些情况下它将完成:

  1. 未经处理就引发了一些异常
  2. completer.set(Result.success())被称为
  3. completer.set(Result.failure())被称为

您的代码中有些情况下可以完成工作程序。

  1. AsyncSyncData.sendCallBack 的调用有很多,这可能导致在ListenableWorker实例上调用 completer.set(Result.success())。 。如果发生这种情况,ListenableWorker会完成工作,因此将不再重新创建它。

“我希望每次用户通过wifi或3g / 4g / 5g连接到Internet时都调用WorkManager startWork()。”

WorkManager不会在用户每次连接到Internet时创建一个新的ListenableWork实例。 WorkManager是用于计划任务的API,并且在在不匹配它们的情况下,ListenableWork习惯于不启动它,在完成ListenableWork之后,上面的讨论已完成了此任务,因此不再需要做。

如果要收听某些连接更改,则应使用 ConnectivityManager.registerNetworkCallback ,然后在用户连接时,即可执行所需的操作。 Here是一些可以帮助您的示例 去做。