3

誰かがこれで私を助けることができますか?

アクティビティを更新できるように、ファイルが変更されているかどうかを確認したいと考えています。いくつかのテストの後、私はそれが単に機能していないと判断しました. 私は何か間違ったことをしていますか?

onEvent メソッドを使用して FileObserver を作成して Toast を表示し、それが機能しているかどうかを確認するためだけにデータをログに記録していますが、onEvent が呼び出されることはありません。既存のファイルと新しいファイルの両方で試しましたが、どちらの場合も機能しないようです。

    Context context = this;
    File fileFolder = context.getFilesDir();

    String fileName = "quest";
    FileObserver questObserver = new FileObserver(fileFolder.getPath()) { // also tried fileFolder.getName()
        @Override
        public void onEvent(int event, String path) {
            Toast.makeText(getApplicationContext(), "onEvent fired", Toast.LENGTH_LONG).show();
            Log.d(TAG, "FileObserver().onEvent");
        }
    };
    questObserver.startWatching();

    /* create file */
    ObjectOutputStream objectOut = null;
    try {
        FileOutputStream fileOut = context.openFileOutput(fileName, Context.MODE_PRIVATE);
        objectOut = new ObjectOutputStream(fileOut);
        objectOut.writeObject(new Quest());
        fileOut.getFD().sync();
    } catch (IOException e) {
        Log.d(TAG, e.getMessage());
    } finally {
        if (objectOut != null) {
            try {
                objectOut.close();
            } catch (IOException e) {
                Log.d(TAG, e.getMessage());
            }
        }
    }

    /* read file */
    ObjectInputStream objectIn = null;
    Quest quest = null;

     try {
         FileInputStream fileIn = context.openFileInput(fileName);
         objectIn = new ObjectInputStream(fileIn);
         quest = (Quest) objectIn.readObject();
     } catch (FileNotFoundException e) {
         // Do nothing
     } catch (IOException e) {
         e.printStackTrace();
     } catch (ClassNotFoundException e) {
         e.printStackTrace();
     } finally {
         if (objectIn != null) {
             try {
                 objectIn.close();
             } catch (IOException e) {
                 Log.d(TAG, e.getMessage());
             }
         }
     }
     Toast.makeText(context, quest.getTitle(), Toast.LENGTH_LONG).show();

    questObserver.stopWatching();

どんな助けでも大歓迎です。

4

2 に答える 2

2

' public abstract void onEvent (int event, String path) " -

このメソッドは、特別な FileObserver スレッドで呼び出されます。スレッドとは独立して実行されるため、適切な同期を使用するように注意してください。同時実行の問題を回避するために、post(Runnable) を使用してイベント処理作業をメイン スレッドにシフトすることを検討してください。

http://developer.android.com/reference/android/os/FileObserver.html

トーストを handler.post(new Runnable(){...}) に通すと、うまくいくはずです。

于 2013-06-21T11:31:05.640 に答える
1

ファイルが(常に)存在しないと仮定すると、次のように取得したファイルフォルダーにオブザーバーを配置する必要があります。

Context ctx = ...;
File filesFolder = ctx.getFilesDir();

filesFolderこれにより、ディレクトリも確実に作成されることに注意してください。

たとえば、ファイルが書き込まれたり、削除されたり、更新されたりするたびに、オブザーバーに通知されるようになりました。たとえば、「クエスト」でファイル名をContext#.openFileOutput(..)フィルターできます。FileObserver

于 2012-11-25T00:39:03.087 に答える