Workmanager (периодический) получает местоположение и загружает данные (Asynctask) убит

Workmanager не отправляет координаты на мой сервер, когда телефон находится в спящем режиме. Асинтаск убит?

Я использую Workmanager (PeriodicWorkRequest) для получения координат каждые 15 минут. Чтобы получить координаты, я использую FusedLocationClient. Это отлично работает... но я также хочу отправить их на свой сервер.

Если я начну отправлять «public void onComplete» (см. код), мне придется использовать AsyncTask (другое решение??). Это работает, когда мой телефон не находится в спящем режиме. Цель состоит в том, чтобы отправка продолжалась. Как я могу это решить (новичок, примеры меня радуют :))

MainActivity Start Workmanager

 public static void scheduleWork(String tag) {
        PeriodicWorkRequest.Builder SendLocation =
                new PeriodicWorkRequest.Builder(LocationWorker.class, 15,
                        TimeUnit.MINUTES);
        PeriodicWorkRequest locationCheckWork = SendLocation.build();
        WorkManager instance = WorkManager.getInstance();
        instance.enqueueUniquePeriodicWork(tag, ExistingPeriodicWorkPolicy.KEEP , locationCheckWork);
    }

Локационворкер

@NonNull
    @Override
    public Result doWork() {
        Log.d(TAG, "onStartJob: STARTING JOB..");

        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(mContext);
        mLocationCallback = new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                super.onLocationResult(locationResult);
            }
        };

        LocationRequest mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        try {
            mFusedLocationClient
                    .getLastLocation()
                    .addOnCompleteListener(new OnCompleteListener<Location>() {
                        @Override
                        public void onComplete(@NonNull Task<Location> task) {
                            if (task.isSuccessful() && task.getResult() != null) {
                                mLocation = task.getResult();
                                Log.d(TAG, "Location : " + mLocation);

                                double latitude = mLocation.getLatitude();
                                double longitude = mLocation.getLongitude();
                                // SEND TO SERVER
                                AsyncTask.execute(new Runnable()
                                {
                                    @Override
                                    public void run() {
                                        HttpURLConnection connection;
                                        try {
                                            //Open a new URL connection
                                            connection = (HttpURLConnection) new URL(myurl)
                                                    .openConnection();

                                            //Defines a HTTP request type
                                            connection.setRequestMethod("POST");

                                            //Sets headers: Content-Type, Authorization
                                            connection.setRequestProperty("Content-Type", "application/json");
                                            connection.setRequestProperty("Accept", "application/json");
                                            connection.setRequestProperty("Authorization", "Token fab11c9b6bd4215a989c5bf57eb678");

                                            String userid= Prefs.getUserid(getApplicationContext());
                                            String compid= Prefs.getCompid(getApplicationContext());


                                            //Add POST data in JSON format
                                            JSONObject jsonParam = new JSONObject();
                                            try {
                                                jsonParam.put("latitude", latitude);
                                                jsonParam.put("longitude", longitude);
                                                jsonParam.put("userid", userid);
                                                jsonParam.put("compid", compid);
                                            } catch (JSONException e) {
                                                e.printStackTrace();
                                            }

                                            //Create a writer object and make the request
                                            OutputStreamWriter outputStream = new OutputStreamWriter(connection.getOutputStream());
                                            outputStream.write(jsonParam.toString());
                                            outputStream.flush();
                                            outputStream.close();

                                            //Get the Response code for the request

                                            BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                                            String responseBody = null;
                                            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
                                                responseBody = br.lines().collect(Collectors.joining());
                                            }
                                            Log.i(TAG, "responseBody: "+responseBody);


                                            //return connection.getResponseCode();
                                        } catch (IOException e) {
                                            e.printStackTrace();
                                        }
                                    }


                                });

                                mFusedLocationClient.removeLocationUpdates(mLocationCallback);
                            } else {
                                Log.w(TAG, "Failed to get location.");
                            }
                        }
                    });
        } catch (SecurityException unlikely) {
            Log.e(TAG, "Lost location permission." + unlikely);
        }

        try {
            mFusedLocationClient.requestLocationUpdates(mLocationRequest, null);
        } catch (SecurityException unlikely) {
            //Utils.setRequestingLocationUpdates(this, false);
            Log.e(TAG, "Lost location permission. Could not request updates. " + unlikely);
        }

        return Result.SUCCESS;
    }

person user3229579    schedule 24.07.2019    source источник
comment
Если он не работает только в спящем режиме, вы уверены, что это не связано с режимом Android Doze, в котором приложения засыпают для экономии заряда батареи. Попробуйте отключить оптимизацию батареи на вашем устройстве для вашего приложения и посмотрите, возникнет ли у вас такая же проблема.   -  person Boardy    schedule 24.07.2019


Ответы (2)


PeriodicWorkRequests будет отложено в спящем режиме. Ваша работа не гарантированно будет выполняться каждые 15 минут. JobScheduler может решить, что он хочет выполнять вашу работу во время интервалов обслуживания.

person Rahul    schedule 24.07.2019

Вы используете синхронного работника, чтобы сделать что-то асинхронное. Вам нужно использовать ListenableWorker, если вы собираетесь ждать обратных вызовов, чтобы что-то сделать в вашем воркере: https://developer.android.com/topic/libraries/architecture/workmanager/advanced/threading

person SumirKodes    schedule 24.07.2019