MutableLiveData变量实例大小问题

时间:2019-11-12 10:59:09

标签: android mutablelivedata

比方说,我们有存储在JSON txt文件中的项目库存。要访问数据,我们使用stringBuilder类加载JSON文件,然后将StokItems填充到:

List<StockItem> stock;

像这样:


                stock.clear();

                Gson gson = new Gson();

                stock = gson.fromJson(stringBuilder.toString(), new TypeToken<List<StockItem>>() {
                }.getType());


由于我们想利用Android中的LiveData,我们引入了:

MutableLiveData<List<StockItem>> stockLiveData = new MutableLiveData<>();

要使其正常工作,我们必须将数据发布到其中:

    public LiveData<List<StockItem>> getLiveStockList() {
        stockLiveData.postValue(stock);
        return stockLiveData;
    }

这是问题所在,如果一行:

        stockLiveData.postValue(stock);

消耗用于创建另一个副本的内存

 List<StockItem> stock

如果这样的话,将“原始数据”保留在内部是个好主意

 stockLiveData

仅减少变量对内存的影响? (如果可能的话...)

2 个答案:

答案 0 :(得分:0)

无需使用global变量来保存临时数据。您可以使用local变量,也可以直接发布到LiveData

public LiveData<List<StockItem>> getLiveStockList() {
    return stockLiveData;
}

然后

List stock = gson.fromJson(stringBuilder.toString(), new TypeToken<List<StockItem>>() { }.getType());
stockLiveData.postValue(stock);

stockLiveData.postValue(gson.fromJson(stringBuilder.toString(), new TypeToken<List<StockItem>>() { }.getType()))

您还可以访问LiveData中的列表,如下所示:

stockLiveData.getValue();

返回原始列表数据。

答案 1 :(得分:0)

我想在这里指出有关您的代码的几件事:

  1. 您不一定需要在getter函数中调用postValue。只要有观察者从您的getter函数观察,您就可以在任何地方发布价值。
  2. 即使您使用可变的实时数据,也不一定意味着您正在为List分配内存或为其创建副本。当您在Mutable Live数据上设置值或发布值时,基本上就是将现有列表引用到Mutable Live数据中的值上。