我正在开发一个包含对象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...
}

10-07 19:09
查看更多