同步日志条目到服务器的发布

| 我的项目有一点问题。我正在开发适用于Android的应用程序,并希望将日志发布到服务器上。几乎一切正常,但是我有一个小问题。我的班上有一个ArrayList来处理帖子:
private ArrayList<String> logsToPost = new ArrayList<String>();
还有一种将数据放入此列表的方法,以及一个独立的线程,该线程每20秒运行一次,然后上传日志并清空列表。问题是,如果线程试图上载数据并清除列表时尝试写入此列表,则会收到ConcurrentModificationException。我的代码如下所示:
Iterator<String> keyIter = logsToPost.iterator();
        while (keyIter.hasNext()) {
        String next = keyIter.next();
        String[] params = next.split(FormFactory.FUNCTION_SEP);
        HttpData hd = HttpRequest.post(LOGCAT_LOG_URL, \"userId=\" + sb.userId + \"&pdaId=\" + sb.pdaId
                + \"&tag=\" + params[0] + \"&logContent=\" + params[1]);
        logsToPost.remove(next);
        }
我知道这里有一个syncedList和synced块,但是我无法让syncedList在我的机器人上工作。您有任何想法如何执行此日志记录过程?我尝试使用volatile关键字,但仍然出现异常。     
已邀请:
从Java的角度来看: 您的代码应始终导致异常,因为您在使用ArrayList.remove而不是Iterator.remove修改ArrayList的同时还要对其进行迭代。 进行此更改通常应该可以解决您的问题:
Iterator<String> keyIter = logsToPost.iterator();
while (keyIter.hasNext()) {
    String next = keyIter.next();
    //do something
    keyIter.remove();
}
为了进一步增强您的任务免受失败风险的影响,您应该考虑在记录任务开始时以原子方式交换ArrayList实例。因此,工作流程为:
ArrayList<String> logsToPost = logListReference.getAndSet(new ArrayList<String>());
for (String logEntry:logsToPost) {
    //doSomething
}
    
在发送过程开始时交换列表是否是一种解决方案?因此,发送过程始终使用\“ old \”列表,而写入过程始终使用\“ new \”列表。 然后,您只需要同步写入新列表并交换它们, 让我说明一下:
public class ListHolder {

  private List newList = new List();

  public syncronized List exchangeAndGetOld() {
    List oldList = this.newList;
    this.newList = new List();
    return oldList();
  }

  public syncronized addToNewList(Object item) {
    newList.add(item);
  }
}
    
对共享列表使用同步收集: 私人Vector logsToPost = new Vector(); 在上传数据之前,请获取该集合的副本:
ArrayList<String> logsToUpload;
synchronized(logsToPost) {
  logsToUpload = new ArrayList<String>(logsToPost);
  logsToPost.clear();
}
在发送循环中使用集合的副本: 迭代器keyIter = logsToUpload.iterator();     

要回复问题请先登录注册