//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 в приведенном выше коде.
Наконец, я добавил код для вывода журнала результатов 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, но он также не показал ожидаемый результат.