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 が展開されることを確認したいと考えています。