2015-06-20 23 views
0

我正在開發一個包含對象ArrayList的Android應用程序。 Arraylist中的每個對象都代表我的應用連接到的藍牙設備。將ArrayList項目連接到線程或其他方式的最佳方法

對於Arraylist中的每個設備,正在運行一個線程來進行藍牙通信。 (我打算把這些線程也放在一個數組中)。

我與掙扎的事情:什麼是ArrayList的項目連接線和周圍的其他方式的最佳方法是什麼?

因爲當有些變化到ArrayList項目時,線程溝通這一變化。當線程接收到通信時,它應該修改Arraylist項目「正在工作」。

解決方案,我一直在想:

  • 我可以給兩個線程和ArrayList項的唯一ID和重申他們陣/ arrylist當一個需要對方。但這似乎很慢。
  • 我可以將線程對象添加到Arraylist中的自定義設備對象中,以便所有內容都處於相同的Arraylist中。但是這不像我應該做的事情。 Arraylist會經常排序,我不知道如果排序,所有的數據都被重新定位(=>這是如何影響線程...)。或者是一個Ararylist只是一個列表引用的對象,它只是列表排序,但對象保持放...

這兩個選項似乎不是最好的解決方案。有沒有人知道做這件事的最好方法是什麼?

我還沒有真正用過線程和Arraylists。

回答

1

或者是Ararylist的對象只是一個清單關閉引用,並是唯一被排序的名單,但對象原地不動......

是的,你猜剛纔引用存儲。這是因爲在Java中你可以有only references對象。

將Arraylist項目連接到線程和其他方式的最佳方式是什麼?

你可以製作一個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... 
} 
+0

」 ......因爲在Java中,你可以有對象只能引用的... 「如果Java程序不能有任何對象,我不確定Java程序會非常有趣。我認爲你的意思是說Java _variables_和Java _arrays_只能保存引用。 –

+0

@Iriorio爲什麼我應該使用地圖的時候也可以使線程成爲Device對象的一部分?我不打算這樣做,因爲對設備進行排序會有很多數據交換,但是當它只是改變引用時,我沒有看到問題,或者是否存在? –

+0

我個人不喜歡圈子引用,這就是爲什麼地圖。沒有什麼能阻止你這樣做,取決於你的需求和個人品味^^ @james是的,我的意思是變量只保存對象引用,而不像C++那樣你可以實際按值傳遞對象 – Ilario

相關問題