【问题标题】:accessing data from concurrentHashMap while it gets updated in background android在后台android中更新时从concurrentHashMap访问数据
【发布时间】:2015-02-14 15:45:46
【问题描述】:

我有一个在后台更新的静态 concurrentHashMap 对象。虽然它正在更新,但我想在另一个线程中访问它的值。我正在使用从文档中了解到的 concurrentHashMap,并认为它适合这种情况

这就是我正在做的事情

for (Map.Entry<String, ArrayList<property>> entry : alldata.entrySet())
        {
            udata.put(entry.getKey(), new ArrayList<property>(entry.getValue()));
        }

在上面的代码中,我正在更新从服务器获取数据的 udata,但在后台。

在另一个线程中,我正在访问其中的一些信息..

  for (String s: sTypes) 
        {
                    if(jprocess.udata != null)
                        {
                            if (jprocess.udata.get(s) != null)
                                {
                                    if (jprocess.udata.get(s).size() > 0) {
                                        if (xcor < jprocess.udata.get(s).size())
                                            if (xcor != -1) {
                                                allData.add(jprocess.udata.get(s).get(xcor));
                                            }
                                    }
                                }
                        }
                }

但是当我尝试从中访问任何索引时,我无法访问任何内容,我希望很清楚我想要什么..

我已经尝试过 ConcurrentHashMap,它应该适用于这种情况,但可能是我不太了解它..

【问题讨论】:

  • 你指的是哪个索引?
  • 哈希图中的任何索引对应于键 ....
  • 首先,为了遵循通用语言,将其称为 value,其次,您确定要在 地图填充后开始访问数据吗?
  • 这是我的观点,地图在后台不断填充......所以我想在它被附加时访问现有值......带有新数据......
  • 我相信你需要看看CountDownLatch()和java.util.concurrency包中的其他类。

标签: android hashmap java.util.concurrent concurrenthashmap


【解决方案1】:

如果你使用的是ConcurrentHashMap,那么没有一点它不会起作用。我强烈怀疑您正在尝试访问错误的索引,或者您在插入和访问特定索引之间没有同步。

为此,只需检查代码和每个 if 条件中 udata 的大小和 xcor 的值。

此外,请仔细阅读this,您一定会确信 ConcurrentHashMap 是您问题的正确解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 2016-04-08
    相关资源
    最近更新 更多