Android 工人停了一会儿
在我的android应用程序中,我使用workerManger每隔15分钟将一些数据上传到我的服务器,然后我决定在4台设备上进行测试: 1.华为荣誉4x(安卓:5.1.1,api级别:22)Android 工人停了一会儿,android,upload,background-process,worker,Android,Upload,Background Process,Worker,在我的android应用程序中,我使用workerManger每隔15分钟将一些数据上传到我的服务器,然后我决定在4台设备上进行测试: 1.华为荣誉4x(安卓:5.1.1,api级别:22) 2.三星Galaxy A8 2016(android:8.0.0,api级别:26) 3.三星A30(安卓:10,api级别:29) 4.Realme5Pro(android:10,api级别:29) 不幸的是,每个设备都有不同的行为 1.华为手机:每小时(不是每15分钟)上传一次数据到服务器 2.三星a8
2.三星Galaxy A8 2016(android:8.0.0,api级别:26)
3.三星A30(安卓:10,api级别:29)
4.Realme5Pro(android:10,api级别:29) 不幸的是,每个设备都有不同的行为 1.华为手机:每小时(不是每15分钟)上传一次数据到服务器
2.三星a8手机:工作正常
3.三星a30手机:反复停止上传一段时间后继续
4.Realme手机:在so的前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)