2012-09-17 19 views
0

我試圖製作一個本地機器連接到無線網絡列表。實現這一點的簡單方法是將每個IP從a.b.c.1 ping到a.b.c.255,但我們都知道這將會「永遠」。很多線程處理程序和一點經驗

因此,我想使用主題!

我已經是一個MainActivity包含此:

list = (ListView) findViewById(R.id.list); 
ipList.add("Nothing yet"); 

adapter = new ArrayAdapter<String>(this, R.layout.simplerow, ipList); 
list.setAdapter(adapter); 

networkList = new NetworkList(); //This is the shared list between the Threads 

for(int i = 1; i<255; i++){ //Tries to ping the range of IP's 

    Ping ping = new Ping(localIP + i, networkList) 
    new Thread(ping).start(); 
} 

實現Runnable:

public void run() { 
    try { 
    InetAddress address = InetAddress.getByName(IP); 

    if(address.isReachable(2000)){ 
     synchronized(networkList){ 
      networkList.addIP(address.getHostAddress()); 
      MainActivity.handler.sendEmptyMessage(0); //probably wrong 
     } 
    } 
    } catch (Exception e) {} 
} 

林不知道,如果同步的使用是正確的,但請繼續!類NetworkList就是同步的東西happends:

public synchronized void addIP(String IP){ 
    foundIPs.add(IP); 
} 

public synchronized ArrayList<String> getIPList(){ 
    return foundIPs; 
} 

確定。回到MainActivity

這可能是非常錯誤的,但其什麼伊夫設法做:

handler = new Handler() { 
     public void sendEmptyMessage(android.os.Message msg) { 
      adapter.clear(); 
      synchronized(networkList){ 
       ipList = networkList.getIPList(); 
      } 
      adapter.notifyDataSetChanged(); 
     } 
    }; 

這裏有什麼問題?我希望列表在線程獲得ping響應時立即更新。換句話說,我希望在發現新的IP時看到ListView展開,而不僅僅是在完成ping過程時檢索完整列表。

回答

1

隨着ipList = networkList.getIPList();你正在創建一個新的列表,一個陣列適配器不知道任何有關。您應該直接在適配器上進行調用,例如ArrayAdapter.add或ArrayAdapter.addAll()。

1

我認爲問題在於適配器本身沒有獲得對新地址列表的引用,所以它可能會查看最老的沒有條目的地址。

我可以通過看代碼看出來:

adapter = new ArrayAdapter<String>(this, R.layout.simplerow, ipList); 
... 
ipList = networkList.getIPList();