Я пытался реализовать Android-залп с помощью Workmanager для загрузки фоновых данных. Никаких проблем с реализацией, но очень сложно поймать и вернуть результат ответа через Result.success для регистрации.
override fun doWork(): Result {
var volley = VolleySingleTon.getInstance(mContext)
.syncLocationData(mContext, location, success = Function { collection ->
ERROR HERE************
**Need to return the return Result.success()**
**but i can't return the above**
}, failure = Function { collection ->
ERROR HERE************
**Need to return the return Result.failure()**
**but i can't return the above**
})
}
Класс метода залпового запроса
fun syncLocationData(
context: Context,
location: List<VehicleLocation>, success: Function<RestCollection, Any>, failure: Function<RestCollection, Any>
) {
var jsonObject: JSONObject? = null
val jsonString = RestUtil.getGson().toJson(location)
try {
jsonObject = JSONObject(jsonString)
} catch (e: JSONException) {
e.printStackTrace()
}
addToRequestQueue(
JsonObjectRequest(
Request.Method.POST,
AppConstants.WEB_SERVER.toString + AppConstants.SYNC_LOC_DATA.toString, jsonObject,
SuccessHandler(context, null, success),
ErrorHandler(context, null, failure)
)
)
}
Обработчик, используемый для получения результата из ответа
class SuccessHandler(
val context: Context,
private val progressBar: ProgressBar?,
private val successCallBack: Function<RestCollection, Any>
) : Response.Listener<JSONObject> {
override fun onResponse(json: JSONObject?) {
if (json != null) {
progressBar?.visibility = View.GONE
val response: ApplicationResponse =
RestUtil.getGson().fromJson(json.toString(), ApplicationResponse::class.java)
successCallBack.apply(response.collection)
}
}
}
Есть ли обходной путь для этого? Спасибо!!
Вы можете проверить эту статью medium.com/@oyinloyeayodeji/…
Вы можете использовать RequestFuture, который является объектом Volley. Это поможет вам создать синхронный вызов в классе Worker.
@NonNull
@Override
public Result doWork() {
RequestFuture<JSONObject> future = RequestFuture.newFuture();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, "https://jsonplaceholder.typicode.com/todos/1", null, future, future);
VolleySingleton.getmInstance(getApplicationContext()).addToRequestQueue(request);
try {
JSONObject response = future.get(60, TimeUnit.SECONDS); // this will block
Log.d(TAG, response.toString());
return Result.success();
} catch (InterruptedException e) {
e.printStackTrace();
// exception handling
return Result.failure();
} catch (ExecutionException e) {
e.printStackTrace();
return Result.failure();
// exception handling
} catch (TimeoutException e) {
e.printStackTrace();
return Result.failure();
}
}Вы также можете прочитать эту статью, чтобы узнать больше medium.com/@oyinloyeayodeji/…
У меня тот же вопрос, кто-нибудь использует залп с workmanager