我认为你应该保留当前的条目以及它们之前或之后的一个(可能是100个),然后将这些数据放入缓存中。
当你滚动列表视图时,获取更多的条目并像之前一样更新缓存(不要一次获取100万条)。
字符串
,如果是华丽的位图
,要分配的对象数量会少得多得多。public class MemoryActivity extends Activity {
private List<TestObject> _testObjects = new ArrayList<TestObject>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_memory);
coolGuysDoNotLookBackAtExplosion();
starCountdown();
}
private void starCountdown() {
new CountDownTimer(300000, 500) {
public void onTick(long millisUntilFinished) {
TextView tv_watcher = (TextView) findViewById(R.id.tv_watcher);
tv_watcher.setText(getMemoryUsage());
}
public void onFinish() {
starCountdown();
}
}.start();
}
private String getMemoryUsage() {
String heapSize = String.format("%.3f", (float) (Runtime.getRuntime().totalMemory() / 1024.00 / 1024.00));
String freeMemory = String.format("%.3f", (float) (Runtime.getRuntime().freeMemory() / 1024.00 / 1024.00));
String allocatedMemory = String
.format("%.3f", (float) ((Runtime.getRuntime()
.totalMemory() - Runtime.getRuntime()
.freeMemory()) / 1024.00 / 1024.00));
String heapSizeLimit = String.format("%.3f", (float) (Runtime.getRuntime().maxMemory() / 1024.00 / 1024.00));
String nObjects = "Objects Allocated: " + _testObjects.size();
return "Current Heap Size: " + heapSize
+ "\n Free memory: "
+ freeMemory
+ "\n Allocated Memory: "
+ allocatedMemory
+ "\n Heap Size Limit: "
+ heapSizeLimit
+ "\n" + nObjects;
}
private void coolGuysDoNotLookBackAtExplosion(){
new Thread(new Runnable() {
@Override
public void run() {
_testObjects = new ArrayList<TestObject>();
while (true) {
_testObjects.add(new TestObject());
}
}
}).start();
}
}
public class TestObject {
private String sampleText = "Lorem Ipsum is simply dummy text of the printing and typesetting industry";
}
分页
和加载更多
按钮作为ListView
的页脚。例如:
url = http://your_full_url.php?page=1
假设每页有100个记录,那么第一次获取第1页
的全部100条记录,将它们显示在ListView
上并进行缓存
。现在滚动ListView
并点击加载更多
按钮(加载更多
按钮应设置为ListView
的页脚)。
当你点击加载更多
时,将通过调用
url = http://your_full_url.php?page=2
等来获取下一个100条记录
url = http://your_full_url.php?page=3
,
url = http://your_full_url.php?page=4
等等...
每次都会缓存这些记录,以便在连接丢失的情况下可以显示缓存中可用的记录。
请查看RecyclerListener,它非常容易实现。
我在文档中没有找到确切的数字。然而,所有Adapter#getCount()
(查看子类)的返回类型都是int。
因此,我们可以强烈怀疑您可以将最多Integer.MAX_VALUE
个项目添加到适配器中,这是231-1(超过20亿)。适配器使用Lists
和Maps
来在内部存储数据,它们具有相同的限制。
因此,您不应该担心适配器的限制,而是使用太多内存。我建议您将10-100个元素加载到适配器中,并在用户到达列表视图底部时简单地添加更多项目。
天威的方法是正确的。
如果ListView是懒加载的,而且由于ListView本身正在回收视图,因此最好只在内存中保留可见的列表条目。您基本上在适配器中执行与ListView对视图相同的操作。
如果您将所有数据都保存在内存中,那么懒加载ListView的意义何在?只需加载所有数据并跳过懒加载部分即可...当然,使用懒加载方法仅加载可见数据(以及可能更多数据),您必须在列表底部和顶部实现懒加载才能使其正常工作。
现在,由于没有关于数据(文本、图像)或来源(Internet、SQLite Db、文本文件...)的信息,我无法为您提供如何实现此操作的代码(示例)。如果您详细说明数据,我可以更准确地回答问题。
我猜测是sqlite数据库和流解析器(GSON)。
ListView
本身,你应该利用它的回收机制:https://dev59.com/5Gct5IYBdhLWcg3wn-xz#14108676。 - super-qua