我有一个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();