両親のために、デジタルフォトカメラから「マイドキュメント」フォルダにファイルをコピーする簡単なプログラムを書いています。彼らは彼らの写真を彼らのカメラから取り除くために常に私の助けを必要とします(彼らはそれほど技術的に進んでいません)ので、私は彼らを助けることに決めました。私はそれをコピー機と呼んだ。Javaで適切なUSBリスナーが見つからなかったので、自分で作成しました。
private void sync()
{
// All devices in an ArrayList
File[] roots = File.listRoots();
ArrayList<File> newList = new ArrayList<File>();
for(File f : roots)
{
newList.add(f);
}
// Delete unavailable devices
ArrayList<File> removeThese = new ArrayList<File>();
for(File f : devices)
{
if(!newList.contains(f))
{
removeThese.add(f);
}
}
devices.removeAll(removeThese);
// Add unknown devices
for(File f : newList)
{
if(!devices.contains(f) && f.canRead() && f.canWrite())
{
alarm(f); // Called when new device inserted
devices.add(f);
}
}
}
このメソッドは、別のスレッドで1000ミリ秒ごとに呼び出されますが、これで十分だと思います。確かに、これは汚い方法ですが、機能します。私はこの機能を頻繁にテストしましたが、常に希望する結果が得られました。プログラムの作成を続けると、プログラムをSystemTrayに非表示にすると、スレッドが新しいデバイスの検出を停止することがわかりました。もう一度開くと、検出スレッドが機能しません。誰かがこれを引き起こす原因とこれを解決する方法を教えてもらえますか?