WorkerManger останавливается через некоторое время - PullRequest
1 голос
/ 14 июля 2020

В моем приложении 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...