Как настроить WorkManager для загрузки в фоновом режиме - PullRequest
0 голосов
/ 17 ноября 2018

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

class Working(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
private val TAG = ""
private val SERVER = ""
private val USERNAME = ""
private val PASSWORD = ""
private val PATH = ""
private val timer = Timer()
override fun doWork(): ListenableWorker.Result {
    Log.i(TAG, "UploadJobService onStartJob")
    UploadFile(applicationContext).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, PATH, SERVER, USERNAME, PASSWORD)
    var uploadTask = UploadFile(applicationContext)
    timer.schedule(UploadTick(uploadTask, applicationContext),0, 1 * 10000)
    return UploadTick.Result.SUCCESS
}
internal class UploadTick(task: UploadFile, ctx: Context): TimerTask() {
    private val SERVER = ""
    private val USERNAME = ""
    private val PASSWORD = ""
    private val PATH = ""

    private var _task = task
    private val _context = ctx

    override fun run() {
        Log.d("UploadTick", _task.status.toString())
        if(_task.status == AsyncTask.Status.PENDING) {
            _task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, PATH, SERVER, USERNAME, PASSWORD)
        } else if(_task.status == AsyncTask.Status.FINISHED) {
            _task = UploadFile(_context)
            _task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, PATH, SERVER, USERNAME, PASSWORD)
        }
    }
}

companion object {

    private val TAG = UploadTick::class.java.simpleName
}

}

1 Ответ

0 голосов
/ 21 ноября 2018

Два решения:

  1. Используйте диспетчер аварийных сигналов с IntentService для периодического планирования задачи, даже если приложение находится в фоновом режиме, как это:

    final AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    final Intent i = new Intent(context, UpdateService.class);
    
    if (pendingIntent == null) {
        pendingIntent = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
    }
        manager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), INTERVAL_TIME_MILLIS, pendingIntent);
    }
    
  2. Используйте менеджер работ и планируйте его периодически следующим образом:

    WorkManager.getInstance().enqueue(new 
    PeriodicWorkRequest.Builder(FiveDayDataApiDownloader.class, 24, 
    TimeUnit.HOURS).setConstraints(new 
    Constraints.Builder().setRequiresBatteryNotLow(true).build()).build());
    
...