Является ли WorkManager правильным решением для меня? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть следующее требование в моем приложении. 1. Я выбираю несколько файлов и нажимаю кнопку «Загрузить». При нажатии кнопки «Загрузить» приложение закрывается. (Я ставлю в очередь запрос и заканчиваю деятельность). 2. После выхода из приложения эти файлы должны быть синхронизированы с сервером в фоновом режиме. 3. Также через определенное время (я установил 16-минутный интервал), в фоновом режиме мне нужно проверить, есть ли несинхронизированные данные, syn c это в фоновом режиме. 4. Если пользователь находится в автономном режиме, несинхронизированные данные должны синхронизироваться в фоновом режиме после установления сетевого подключения.

Я использовал WorkManager Periodi c Рабочий запрос для достижения этой цели. Но при тестировании на моем Asus Zenfone3 я заметил, что: 1. Если мое устройство переходит в спящий режим, doWork () после этого не выполняет execute .

Если я отключу мобильные данные, а затем включу их, doWork () не запустится немедленно. Я установил 1 ограничение: .setRequiredNetworkType(NetworkType.CONNECTED). Это выполняется только после того, как его интервал завершен. Мне нужна немедленная синхронизация c в сети.

Также иногда нажатие на кнопку загрузки не приводит к вызову doWork ().

Is WorkManager (2.3.2) правильный подход, которому я следую. Любое руководство для достижения выше требования. будет оценено.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Если вы прочитали android, диспетчер документации не является хорошим способом планирования повторяющихся задач, а когда устройство переходит в режим ожидания, диспетчер работы с потоками также переводится в режим сна, чтобы сэкономить заряд батареи, вместо этого попробуйте использовать обработчик. https://developer.android.com/reference/android/os/Handler в коде, который я разместил, я использовал обработчик и firebase jobdispatcher для регистрации местоположения пользователя с фиксированным интервалом в 30 секунд, и он работает, даже когда устройство находится в спящем режиме

// файл с обработчиком и диспетчером заданий firebase

public class GetterService extends JobService {
private HandlerThread handlerThread = new HandlerThread("HandlerThread");
private Handler threadHandler;
int delay = 30*1000;
Runnable runnable;
LocationManager locationManager;

@Override
public boolean onStartJob(@NonNull com.firebase.jobdispatcher.JobParameters job) {
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    handlerThread.start();
    threadHandler = new Handler();
    threadHandler.postDelayed(runnable= () -> {
        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        Location repeatedLocations = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        Log.i("location logger", "getting Longitude as "+ repeatedLocations.getLongitude() +" getting Latitide as "+repeatedLocations.getLatitude());
        threadHandler.postDelayed(runnable,delay);
    },delay);
    return false;
}

@Override
public boolean onStopJob(@NonNull com.firebase.jobdispatcher.JobParameters job) {
    return false;
}

}

// файл с получателем местоположения

public class LocationGetter extends AppCompatActivity implements LocationListener {
LocationManager locationManager;
@BindView(R.id.latitudeVal)
TextView latitudeVal;
@BindView(R.id.longitudeVal)
TextView longitudeVal;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 2);
    } else {
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1, 1, this);
    }
    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher
            (new GooglePlayDriver(getApplicationContext()));

    Job notificationJob = dispatcher.newJobBuilder()
            .setService(GetterService.class)
            .setRecurring(true).setTag("jid")
            .setLifetime(Lifetime.UNTIL_NEXT_BOOT)
            .setTrigger(Trigger.executionWindow(1, 10000))
            .setReplaceCurrent(false)
            .build();
    dispatcher.mustSchedule(notificationJob);
}

@OnClick(R.id.ping)
public void onPingClick() {

}

@Override
public void onLocationChanged(Location location) {
    latitudeVal.setText("" + location.getLatitude() + "");
    longitudeVal.setText("" + location.getLongitude() + "");
    Log.i("dfjh", "" + location.getLongitude() + "    " + location.getLatitude());
}

@Override
public void onStatusChanged(String s, int i, Bundle bundle) {

}

@Override
public void onProviderEnabled(String s) {

}

@Override
public void onProviderDisabled(String s) {

}

@Override
protected void onDestroy() {
    super.onDestroy();

}

}

0 голосов
/ 27 февраля 2020

WorkManager является предпочтительным решением для Android для отложенных задач. Если вы хотите немедленного действия, вы можете рассмотреть реализацию логики c, которую вы хотите в Foreground Service.

Что касается того, что происходит, когда ваше устройство переходит в режим ожидания, WorkManager пытается минимизировать потребление батареи и уважать это. Опять же, если вам нужно, чтобы ваши задачи выполнялись, даже когда устройство должно go переходить в режим ожидания, WorkManager не является правильным решением. Но у вас должна быть веская причина, чтобы оправдать такое поведение, поскольку оно отрицательно скажется на времени автономной работы.

Чтобы понять, что происходит с Asus Zenfone3, было бы полезно увидеть как вы ставите в очередь WorkRequest и журналы WorkManager .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...