4

両親のために、デジタルフォトカメラから「マイドキュメント」フォルダにファイルをコピーする簡単なプログラムを書いています。彼らは彼らの写真を彼らのカメラから取り除くために常に私の助けを必要とします(彼らはそれほど技術的に進んでいません)ので、私は彼らを助けることに決めました。私はそれをコピー機と呼んだ。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に非表示にすると、スレッドが新しいデバイスの検出を停止することがわかりました。もう一度開くと、検出スレッドが機能しません。誰かがこれを引き起こす原因とこれを解決する方法を教えてもらえますか?

4

1 に答える 1

2

ユーザーが挿入したデータを保存すると、新しいデバイスの検出が停止しました。これは私が愚かだったので、私にこれを知らせてくれてありがとう。

public boolean saveSettings() 
{
    File f = new File(fsv.getHomeDirectory() + File.separator + "settings.cms");
    ObjectOutputStream objOut;
    try 
    {
        // Here was my problem. 
        detector.stopDetection();

        if(gui.saveSettings())
        {
            // Settings-file wegschrijven
            objOut = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(f)));
            objOut.writeObject(settings);
            objOut.flush();
            objOut.close();
            return true;
        }
        else
        {
            return false;
        }
    } 
    catch (IOException e) 
    {
        handleExceptions(e);
        return false;
    }
}
于 2012-07-03T18:44:32.603 に答える