我有以下情况:
我发现这篇文章:Android AsyncTask ListView - JSON|Surviving w/ Android这很好,但不是我想要的。每次用户返回MainActivity时,我都不想执行AsyncTask。
我想过将ListView项存储在Application的全局可用参数中。此参数将是某种自定义容器,其中包含ListItems及其到期时间戳。然后,如果ListView项有效,则可以检查AsyncTask的“doInBackground”方法。如果是,则返回它们,否则它们将从URL加载并保存到全局变量中。
我的问题:这个解决方案有意义吗?你怎么解决这个问题?有关改善这一点的任何想法吗?
答案 0 :(得分:1)
嗯,你的有意义;但是,我想补充一点。
编码部分,
LruCache
类中定义的Application
。解析JSON后,每个键/值对都存储数据模型。例如,cache.put(model.id, model)
。 对于UX部分,
您不需要每次都更新JSON,但提供动作触发器来执行此操作。一些常见的方法是:
ActionBar
上的项目...)ListView
以刷新内容。答案 1 :(得分:0)
由于ListView数据在检索时已经被序列化为JSON,我认为最好的方法是坚持使用JSON。 Android处理SharedPreferences中的持久字符串。您还可以使用SharedPreferences持久保存keepalive时间戳,以便确定何时刷新数据。
这将允许您在不查询服务器的情况下在应用程序加载之间以及活动之间填充ListView。
答案 2 :(得分:0)
var api={
getapicallForCategories(){
var url='your url';
return fetch(url).then((res)=>res.json());
},
};
module.exports=api;
componentDidMount() {
api.getapicallForCategories().then((res) => {
this.setState({
listdata: res,
})
});
}
//inside render
for (var m = 0; m < this.state.listdata.length; m++) {
this.state.listdataCategory[m] = this.state.listdata[m].Category;
this.state.listdataPrice[m] = this.state.listdata[m].Amt;
const details = {
name: this.state.listdataCategory[m],
price: this.state.listdataPrice[m],
}
list.push(details);
}
// inside return
{
list.map((l, i) => (
<ListItem
key={i}
title={l.name}
subtitle={l.price}
rightIcon={<Icon name={'add-circle'} style={{ color: '#006400', fontSize: 40 }} onPress={() => this.onIncrease(l.price, i)} />}
avatar={<Icon name={'remove-circle'} style={{ color: '#FF0000', fontSize: 40 }} onPress={() => this.onRemove(l.price, i)} />}
/>
))
}