我正在开发一个包含对象ArrayList的Android应用程序。
Arraylist中的每个对象代表我的应用程序已连接到的Bluetooth设备。
对于Arraylist中的每个设备,正在运行一个进行Bluetooth通信的线程。 (我还计划将这些线程放入数组中)。
我正在努力的事情是:将Arraylist项连接到线程以及其他方式的最佳方法是什么?
因为当Arraylist项发生更改时,线程必须传达此更改。并且当线程接收到通信时,它应该修改它正在工作的Arraylist项。
我一直在思考的解决方案:
我可以给线程和Arraylist-item一个唯一的ID,并在一个需要另一个时迭代它们的数组/数组。但这似乎很慢。
我可以将线程对象添加到Arraylist中的自定义设备对象中,以便所有内容都在同一Arraylist中。但这感觉不像我应该做的。 Arraylist会经常排序,我不知道排序时是否会重定位所有数据(=>这如何影响线程...)。还是Ararylist只是列出了对象的引用,而仅仅是被排序的列表,但是对象仍然保留着...
这两个选项似乎都不是最佳解决方案。有人知道这样做的最好方法是什么吗?
我还没有真正使用线程和Arraylist。
最佳答案
还是Ararylist只是列出了对象的引用,而仅仅是被排序的列表,但是对象仍然保留着...
是的,正如您猜测的那样,引用仅存储在其中。这是因为在Java中,对象可以具有only references。
将Arraylist-item连接到线程以及其他方法的最佳方法是什么?
您可以创建一个Map<Device, Thread>
,这样您就可以轻松获取与该对象关联的Thread
。对于另一种关联,您应该扩展Thread
类以存储对该设备的引用。为确保关联正确,您可以创建自己的关联类,该类由地图支持并负责创建和启动线程
public class Association{
private Map<MyDevice, MyThread> map;
public MyThread add(MyDevice device){
MyThread t = new MyThread(device);
map.put(device, t);
return t;
}
public void stopThread(final Device d){
final Thread t = map.get(d);
if(t != null && t.isAlive()){
new Thread( () -> {
t.interrupt();
try{ t.join(); }
catch(InterruptedException ex){}
}).start();
map.remove(d);
}
}
... // Constructor, thread getter, remove logic, sorting...
}