gpt4 book ai didi

java - 如何实现单个函数以在 AsyncTask 之后返回数据,或者如果之前已缓存则同步返回数据?

转载 作者:行者123 更新时间:2023-11-30 10:51:31 25 4
gpt4 key购买 nike

我正在尝试在 Android 应用程序中实现缓存。我添加了一个静态全局数组作为

public static State[][] stateList = new State[Country.values().length][];

这里的国家总是固定的,所以我做了一个枚举,但状态往往会时不时地改变,所以我从服务器中提取数据(它有一个很好的后端,我可以在其中编辑/添加/删除状态)。

我有一个简单的国家/地区下拉选择,下面有一个 ListView ,一旦做出选择,它就会自动更改。我当前的实现发出这样的纯网络请求...

new FetchStatesTask(this, country, mProgressBar, view).execute();

它在网络获取期间显示进度条,然后 onPostExecute 停止它,然后进行回调 onStatesFetched(State[] states),其中包含正确重新填充 ListView 的代码。

但我想实现缓存,所以我的想法是将获取的数据存储在 stateList 数组中。我最初的想法是做这样的事情..

if(stateList[country] == null)
// Do network request FetchStatesTask and then call onStatesFetched with result
else
// Directly call doStatesFetched passing stateList[country]

但我正在寻找替代方案,例如..

public static State[] getStateList[]
{
if(stateList[country] == null)
// Do network request FetchStatesTask and then return State[] after async operation
else
// Return stateList[country]
}

这样我就可以删除回调监听器并使用一个函数来完成获取状态和返回的整个过程,并且在 stateList 已经缓存在数组中的情况下同步执行,如果之前没有缓存则执行异步操作。我不确定我将如何实现上述逻辑,因此不胜感激。谢谢

最佳答案

您最初的想法很好,因为正如您所说,它用于 android app 中的下拉列表,因此不能同时执行许多此类操作。把事情简单化。但最好将 State[][] stateList 声明为 volatile。因为根据 Java 内存模型 volatile 提供“可见性保证”。
这里是简要说明"What does volatile do?"

如果您仍然想使用 State[] getStateList() 而不是使用双重检查锁定样式

private static volatile String[][] stateList;
...

public State[] getStateList() {
if (stateList[country] == null) {
synchronized (this) {
if (stateList[country] == null) {
// Do network request FetchStatesTask and then return State[] after async operation
}
}
}
return stateList[country];
}

但在这种情况下,我不明白为什么你需要“异步操作之后返回状态[]”,因为这样的函数签名意味着线程进入getStateList() 如果 stateList[country] == null 这个线程会在 async operation 完成之前等待并且只有在那之后 返回 State []。所以调用 State[] getStateList() 总是同步的(更准确地说,阻塞)。如果方法返回非 void 值并等待阻塞操作完成,则它不能是非阻塞的,或者如您所说,async if not cached before
所以要么你用你原来的想法,要么每次都使用FetchStatesTask(持有stateList缓存),只有当它为空时才进行网络请求。

关于java - 如何实现单个函数以在 AsyncTask 之后返回数据,或者如果之前已缓存则同步返回数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34697817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com