0

我试图列出连接到 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 过程完成时检索完整列表。

4

2 回答 2

1

我认为问题在于适配器本身没有获得对新 IP 地址列表的引用,因此它可能会查看没有条目的最旧列表。

我可以通过查看代码看到它:

adapter = new ArrayAdapter<String>(this, R.layout.simplerow, ipList);
...
ipList = networkList.getIPList();
于 2012-09-17T21:58:42.643 回答
1

随着ipList = networkList.getIPList();您创建一个新列表,阵列适配器对此一无所知。您应该直接在适配器上进行调用,例如 ArrayAdapter.add 或 ArrayAdapter.addAll()。

于 2012-09-17T22:37:31.640 回答