Android PerodicWork никогда не работает на Oreo - PullRequest
0 голосов
/ 04 ноября 2018
//work version : 1.0.0-alpha10
class TestWork(context: Context,parameters: WorkerParameters) : Worker(context,parameters) {

  override fun doWork(): Result {

    Observable.timer(2L,TimeUnit.MINUTES,Schedulers.io())
        .subscribe({
            append(applicationContext,"Success")
        },{ e->
            append(applicationContext,"Error : ${e.message}")
        })

    return Result.SUCCESS
  }


  companion object {

    fun append(context: Context,text:String){
        val time = SimpleDateFormat("MM/dd hh:mm:ss", Locale.US).format(Date())
        val buffer = StringBuilder(readLine(context))
        buffer.appendln("$time  $text")

        context
            .getSharedPreferences("Update",Context.MODE_PRIVATE)
            .edit()
            .putString("status",buffer.toString())
            .apply()
    }

    fun readLine(context: Context):String{
        return context
            .getSharedPreferences("Update",Context.MODE_PRIVATE)
            .getString("status","") ?: ""
    }
  }
}

Приведенный выше код просто сообщает результат моей работы через две минуты.

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    startWork()
  }

private fun startWork() {

    val work = PeriodicWorkRequest.Builder(
        TestWork::class.java,
        20, TimeUnit.MINUTES
    )
        .setConstraints(createConstraint())
        .build()

    WorkManager.getInstance().enqueueUniquePeriodicWork(
        "Test-Update",
        ExistingPeriodicWorkPolicy.KEEP,
        work
    )
  }

private fun createConstraint(): Constraints {
    val builder = Constraints.Builder()
        .setRequiredNetworkType(NetworkType.CONNECTED)
        .setRequiresBatteryNotLow(true)
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
        builder.setRequiresDeviceIdle(true)
    }
    builder.setRequiresStorageNotLow(true)
    return builder.build()
  }
}

Когда MainActivity запущена, я регистрирую TestWork с WorkManager в приведенном выше коде.

enter image description here

Наконец, я добавил код для вывода журнала результатов TestWork, сохраненного в настройках, в текстовое представление при нажатии кнопки.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    startWork()

    button.setOnClickListener {
        status.text = TestWork.readLine(this)
    }

}

Я запускал этот код на том же AVD для Lolipop (API 22) и Oreo (API 26), и Lolipop выдал ожидаемый результат, но Oreo не выводил никаких выходных данных в течение какого-либо промежутка времени.

Нужно ли использовать другой код, чтобы получить WorkManager прямо из коробки в Oreo? Я уже использовал JobService, но он также не показал ожидаемый результат.

...