如何在 JSONArray 中获取包含 6000+ 个对象的 JSON API 响应



我有一个JSON API,它在JSONArray中返回6000+对象。

我已经实现了Rxjava调用改造GET API调用。没有任何错误,只有一句话说"做部分代码缓存收集,代码=30KB,数据=19KB"。

如何获取 API 数据?是否可以增加改造响应的缓存?

我不确定配置缓存大小是否会解决您的问题,但您可以通过配置客户端来增加缓存。如果你使用的是OkHttpClient,你可以这样做。

val clientBuilder = OkHttpClient.Builder()
//pass context here
val cacheDir = File(context.applicationContext.cacheDir, "someChildName")
//Required Cache size
val DISK_CACHE_SIZE = 50 * 1024 * 1024; // 50MB
val cache = Cache(cacheDir, DISK_CACHE_SIZE)
//You can use .cache() to configure your Client
clientBuilder.cache(cache).build()

在清单文件中,您可以像下面这样设置它,android:largeHeap="true"

<application
        android:icon="@drawable/app_logo4"
        android:label="@string/app_name"
        android:largeHeap="true"

但是RAM容量有限的手机或旧手机会很慢。

如果 API 提供分页,那么最好使用分页,因为 6000+ 数据是巨大的。应用的性能会下降,并且可能还会收到内存不足 (OOM( 异常,在低连接情况下,应用始终收到超时问题。

一种解决方案是以分钟为单位设置超时.connectTimeout(15, TimeUnit.MINUTES);,使用@Sagar Vekariya代码。并且不要在主线程中调用您的 API;最好使用协程。

fun methodName(callback:(ArrayList<Bean>)->Unit) {
    GlobalScope.launch(Dispatchers.IO) {
         val list = get6KData()
         callback.invoke(list)
    }
}

你可以再做一件事。不要在对象中转换响应;只需将其视为简单的 JSON 文本文件即可。这将解决您的 OOM 问题。稍后解析 JSON 内容并直接插入数据库,并在数据库中触发查询,并使用分页在应用中列出。例如

fun methodName() {
    GlobalScope.launch(Dispatchers.IO) {
         val json = get6KData() // Get JSON text here
         parsingNinsertDB(json)
         // Here you can return the first batch or use another common method for pagination
    }
}

fun pageMethod(pageNo:Int,callback:(ArrayList<Bean>)->Unit) {
     GlobalScope.launch(Dispatchers.IO) {
     val list = db.get6KData(pageNo)
     callback.invoke(list)
    }
}
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
builder.addInterceptor(logging);
builder.readTimeout(60, TimeUnit.SECONDS);
builder.connectTimeout(5, TimeUnit.MINUTES);
Gson gson = new GsonBuilder()
     .setLenient()
     .create();
OkHttpClient httpClient = builder.build();
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .client(httpClient)
        .build();

最新更新