1

ログをファイルに書き込む独自のロガーを実装したいと思います。多くのスレッドから実行される可能性があり、問題はログファイルへのアクセスを同期する方法です。

   private synchronized static void writeToFile(String tag, String msg, 
        Throwable tr, Context ctx) {
    try {
        String s = System.getProperty("line.separator");
        File f = Environment.getExternalStorageDirectory();
        Log.i(TAG, "Path to app " + f.getAbsolutePath());
        File l = new File(f, "log.txt");
        if (!l.exists()) {
            l.createNewFile();
        }

        String e = Log.getStackTraceString(tr);
        StringBuilder b = new StringBuilder();
        b.append(HttpCommand.getDateForUrl(System.currentTimeMillis()));
        b.append(tag);
        b.append(msg);
        b.append(e);
        b.append(s);

        OutputStream out = new FileOutputStream(l);
        out.write(b.toString().getBytes());
        out.flush();
        out.close();
    } catch (IOException e) {
        Log.e(TAG, "Failed to create backup");
    }
}

別のスレッドに渡す場合、データベースへのアクセスをクラスごとの同期と同期するだけで十分ですか?

synchronized(X.class) {
    writeTiFile()
}
4

2 に答える 2

0

writeToFile()関数は同期されているため、同期された{}ブロックで関数への呼び出しをラップする必要はありません。

詳細については、こちらを参照してください: http: //docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

于 2012-11-26T11:53:26.800 に答える
0

ConcurrentLinkedQueue を使用して、すべてのメッセージをキューに入れ、キューから取得してファイルに書き込むスレッドを作成できます。

于 2012-11-26T12:08:40.893 に答える