0

Wi-Fi に接続されているローカル マシンのリストを作成しようとしています。これを行う簡単な方法は、abc1 から abc255 までのすべての IP に ping を実行することですが、それには「永遠に」かかることは誰もが知っています。

したがって、私はスレッドを使用したいと思います!

私が持っているのは、これを含む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 で応答を受け取ると、すぐにリストを更新したいと考えています。言い換えれば、ping プロセスが完了したときに完全なリストを取得するだけでなく、新しい IP が見つかったときに ListView が展開されることを確認したいと考えています。

4

2 に答える 2

1

ipList = networkList.getIPList();配列アダプターが何も知らない新しいリストを作成しているとします。ArrayAdapter.add や ArrayAdapter.addAll() など、アダプターで直接呼び出しを行う必要があります。

于 2012-09-17T22:37:31.640 に答える
1

私が問題だと思うのは、アダプター自体が新しいIPアドレスのリストへの参照を取得しないため、おそらくエントリのない最も古いリストを参照することです。

コードを見るとわかります:

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