我試圖製作一個本地機器連接到無線網絡列表。實現這一點的簡單方法是將每個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過程時檢索完整列表。