WooCommerce Rest Api Android库问题Woodroid

问题描述

woodroid library之后,我正在使用this将数据从我的wordpress woocommerce网站获取到我的android应用中。现在,该库只能一起检索所有数据,然后可以显示它。但是我不知道为什么我的应用程序以这种方式加载数据的速度非常慢。因此,我需要使用以下代码逐一获取值(作为示例产品)来加快流程,

  val allProducts : mutablelivedata<Product> by lazy {
        woocommerce = Woocommerce.Builder().setSiteUrl(baseURL)
            .setApiVersion(Woocommerce.API_V2)
            .setConsumerKey(consumerKey)
            .setConsumerSecret(consumerSecret)
            .build()
        preLoadProducts()
        mutablelivedata<Product>()
    }

    private fun preLoadProducts() {
        val productFilter = ProductFilter()
        productFilter.page = pageNum
        productFilter.per_page = 1
        loadProducts(productFilter)
    }

    private fun loadProducts(productFilter: ProductFilter){
        woocommerce.ProductRepository().products(productFilter).enqueue(object :
            Callback<List<Product>> {
            override fun onResponse(call: Call<List<Product>>,response: Response<List<Product>>) {
                try{
                    val productsResponse = response.body()
                    allProducts.value = productsResponse?.get(0)
                    pageNum ++
                    preLoadProducts()
                }catch (e : Exception){
                    e.printstacktrace()
                    allProducts.value = null
                }

            }
            override fun onFailure(call: Call<List<Product>>,t: Throwable) {
                t.printstacktrace()
                allProducts.value = null
            }
        })
    }

现在,我知道这不是实现此目标的最有效方法,但它对我有效(几乎)。 因此,我需要一个更好,更有效的解决方案。如果有人有任何想法,请帮忙。 谢谢

解决方法

这与我所做的非常接近

我建议使用库 paging

这个库会做一切

另外,为了节省内存,对 kotlin 使用 rxjava 或协程 这也会有帮助

查看 Java 中的这段代码,因为它向您展示了如何以灵活的方式获取完整的数据以节省内存


@GET("wp-json/wc/v3/coupons?")
Observable<ArrayList<Coupons>> get_List_Codes(  @Query("page") int page,@Query("consumer_key") String consumer_key,@Query("consumer_secret") String consumer_secret);


Observable<ArrayList<Coupons>> getPageAndNext(int c) {

    return ClientApi.getInstance().get_List_Codes(count)
          ) )
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.computation())
            .concatMap(obsOld-> {

                if (obsOld.size() == 0) {
                   return Observable.just(obsOld);
                }
                else {
                    count ++;
                     return Observable.zip(Observable.just(obsOld),getPageAndNext(count),(product11,product22) -> {
                                product11.addAll(product22);
                                return product11;
                            });

                }
            }
            );


}