我试图列出连接到 wifi 的本地机器。做到这一点的简单方法是 ping 从 abc1 到 abc255 的每个 IP,但我们都知道这需要“永远”。
因此我想使用线程!
我所拥有的是一个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();
}
Ping类实现了 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类是同步内容发生的地方:
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 响应时立即更新列表。换句话说,我希望看到 ListView 在找到新 IP 时展开,而不仅仅是在 ping 过程完成时检索完整列表。