gpt4 book ai didi

java - 并行使用 ArrayList

转载 作者:行者123 更新时间:2023-11-30 00:50:50 25 4
gpt4 key购买 nike

在我的应用程序中,我得到周期性的 GPS 坐标,我将其添加到 ArrayList,同时有一个 AsyncTask 正在运行,将坐标发送到服务器。

    public void onLocationChanged(Location location) {
....extra code here

locationUpdates.add(locationData);

....extra code here
}

在 AsyncTask 中:

    private class InsertTripDetails extends AsyncTask<String, Void, Void>
{
@Override
protected Void doInBackground(String... params)
{
while(true)
{
for (int i = locationUpdates.size() - 1; i >= 0; i--) {
ArrayList<PropertyInfo> props = new ArrayList<PropertyInfo>();
props.add(MyUtils.CreateProp("TripID", tripID, String.class));
props.add(MyUtils.CreateProp("LocationTime", locationUpdates.get(i).LocationTime, String.class));
props.add(MyUtils.CreateProp("Latitude", locationUpdates.get(i).Latitude, String.class));
props.add(MyUtils.CreateProp("Longitude", locationUpdates.get(i).Longitude, String.class));
props.add(MyUtils.CreateProp("TripSpeed", locationUpdates.get(i).SpeedKMPH, String.class));

String response = MyUtils.getResponse("InsertTripDetail", props);

if (response.equals("yes")) {
locationUpdates.remove(i);
sentData++;
SetSentBufferedData();
PlayTone();
}
PlayInternetAlertIfNeeded();
}

if(isCancelled() && (locationUpdates.size()==0))
break;
}
return null;
}

@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);

}
}

我相信这可能会导致问题,因为两个线程将同时操作 ArrayList。关于如何“安全地”做到这一点的任何建议

最佳答案

I believe this could cause a problem as both threads will simultaneously manipulate the ArrayList. Any suggestion on how to do that "safely"

每当一个非原子对象在两个线程之间共享,并且至少有一个线程修改它时,同步对它的访问是必不可少的。有些类会自动提供所需的同步(它们的文档会告诉您),但大多数不会。 java.util.ArrayList 没有。

有几种选择;一种更简单的方法是使用 Collections.synchronizedList() 在您的 ArrayList 周围创建一个同步包装器,并(在任何地方)使用它而不是使用底层 ArrayList 直接。

这方面还有其他潜在问题,但您似乎已经对它们有所关注。例如,我看到您按索引迭代列表元素,而不是使用 Iterator 或增强的 for 循环。这将保护您免受 ConcurrentModificationException 的影响。从初始列表大小向后迭代也可以很好地解决一些可能由另一个线程将元素添加到列表中而引起的问题,但要注意元素被删除的可能影响。

关于java - 并行使用 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41063276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com