Как сделать вызовы сетевого API на SliceProvider и установить информацию о Slice

Я боролся по этому вопросу несколько дней. Итак, что я хочу сделать на Android Slices - это создать слайс с информацией, полученной из внутреннего сервиса. Например: в классе SliceProvider

@Override
public Slice onBindSlice(Uri sliceUri) {
    l.d(TAG,"onBindSlice called");
    switch (sliceUri.getPath()) {
        case "/product":
            makeRequestForProduct();
            return createProductSlice(sliceUri);
    }
    return null;
}

а также

private void makeRequestForProduct() {
    String url = Environment.getInstance().getCompleteUrl("etc..");
    RetrofitFactory.defaultBuilder(ProductWebInterface.class)
            .getProductResponse(url).enqueue(new ProductWebcallback());
}
public void onEventMainThread(ProductReceivedEvent response) {
    if (response.getProduct() != null) { //do something
    }
}

Но я понятия не имею, как это сделать. Выше код не работает. Это дает мне исключение.

1 ответ

Решение

Согласно документации Google здесь:

onBindSlice should return as quickly as possible so that the UI tied to this slice can be responsive. No network or other IO will be allowed during onBindSlice. Any loading that needs to be done should happen in the background with a call to ContentResolver.notifyChange(Uri, ContentObserver) when the app is ready to provide the complete data in onBindSlice.

Поэтому вы должны выполнять свою работу в фоновом потоке.

Смотрите пример ниже в Kotlin:

 private fun makeRequestForProductInTheBackground(sliceUri : SliceUri) {
        Completable.fromAction {
            makeRequestForProduct(sliceUri)
        }.subscribeOn(Schedulers.io()).subscribe()
 }

После завершения запроса вы можете сохранить свои данные где-нибудь, например, в переменной или хранилище.

fun onEventMainThread(response: ProductReceivedEvent) {
        if (response.getProduct() != null) { 
          //Save your data in a variable or something depending on your needs
          product == response.getProduct()

          //This will call the *onBindSlice()* method again
          context?.contentResolver?.notifyChange(sliceUri, null)
        }
    }

Затем вы можете использовать данные о продукте в вашем методе createProductSlice(sliceUri)

Другие вопросы по тегам