В моем приложении android я использую workerManger для загрузки некоторых данных на свой сервер каждые 15 минут , а затем я решил протестировать его на 4 устройствах:
1. Huawei Honor 4x (android: 5.1.1, уровень api: 22)
2.Samsung Galaxy A8 2016 (android: 8.0.0, уровень api: 26)
3.Samsung A30 (android : 10, уровень API: 29)
4.Realme 5 pro (android: 10, уровень API: 29)
И, к сожалению, каждое устройство ведет себя по-разному
1. Телефон Huawei: загружал данные на сервер каждый час (не каждые 15 минут)
2. Телефон Samsung a8: работает нормально
3. Телефон Samsung a30: неоднократно прекращает загрузку на некоторое время, а затем продолжайте
4. Телефон Realme: отлично работает в течение первых 10 циклов, а затем перестает работать
Все это с запущенным приложением, и я не перезагружал телефоны и даже не убивал приложение, поэтому я чувствую себя потерянным и не знаю, как справиться с этим совершенно другим поведением, я даже пытался использовать Stetho (которые включают chrome инструменты разработчика для вашего приложения), чтобы просмотреть базу данных workManger, но я не нашел базу данных.
Вот мой рабочий
const val NETWORK_URL = "URL"
const val REQUEST_METHOD = "REQUEST_METHOD"
const val REQUEST_BODY = "REQUEST_BODY"
private const val TAG = "NetworkWorker"
class NetworkWorker(appContext: Context, workerParams: WorkerParameters) :
Worker(appContext, workerParams) {
private lateinit var mUser: FirebaseUser
override fun doWork(): Result {
WorkManager.getInstance(applicationContext).pruneWork()
if (Firebase.auth.currentUser == null) {
Log.e(TAG, "doWork: user is null")
return Result.failure()
} else {
mUser = Firebase.auth.currentUser!!
}
val url = inputData.getString(NETWORK_URL)!!
val method = inputData.getInt(REQUEST_METHOD, Request.Method.GET)
val body = if (inputData.getString(REQUEST_BODY) == null) {
null
} else {
JSONObject(inputData.getString(REQUEST_BODY)!!)
}
Log.d(TAG, "doWork: body is $body")
val queue = Volley.newRequestQueue(applicationContext)
Log.d(TAG, "doWork: url is $url")
mUser.getIdToken(true)
.addOnCompleteListener { task ->
if (task.isSuccessful) {
val idToken = task.result!!.token
Log.d(TAG, "doWork: token is $idToken")
val request = object : JsonObjectRequest(method, url, body,
Response.Listener { response ->
Log.d(TAG, "doWork: $response")
},
Response.ErrorListener { error ->
Log.e(TAG, "doWork: error is", error)
}) {
override fun getHeaders(): MutableMap<String, String> {
val params = HashMap<String, String>()
params["Content-Type"] = "application/json"
params["Authorization"] = "$idToken"
return params
}
}
queue.add(request)
} else {
Log.e(
TAG,
"doWork: error getting the token",
task.exception
)
}
}
return Result.success()
}
}
и вот как Я ставлю его в очередь в своей деятельности
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val uploadLocationWork = PeriodicWorkRequest
.Builder(NetworkWorker::class.java, 15, TimeUnit.MINUTES)
.setInputData(
workDataOf(
NETWORK_URL to "http://10.1.0.11:8000/api/location",
REQUEST_BODY to json,
REQUEST_METHOD to Request.Method.POST))
.setConstraints(constraints)
.build()
WorkManager
.getInstance(this)
.enqueueUniquePeriodicWork(
"testWorkManger",
ExistingPeriodicWorkPolicy.KEEP,
uploadLocationWork)