Android プロジェクトの開発中に、Timber ログ ライブラリの使用が推奨されていることに遭遇しました。しかし、それを使用するように切り替えたとき、配置したアクティビティが Timber.plant(new Timber.DebugTree());
ライフサイクルを再開すると (2 回目の呼び出しonCreate(savedInstanceState)
)、Timber によって生成されたすべてのログが LogCat パネルで 2 回生成されることがわかりました。
この簡単なコードは、問題を示しています。
public class MainActivity extends AppCompatActivity {
private static final String TAG = "StateChange";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Timber.plant(new Timber.DebugTree()); // plant a debug tree
setContentView(ActivityMainBinding.inflate(getLayoutInflater()).getRoot());
Timber.tag(TAG).i("onCreate"); // using timber log
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy"); // using android log
}
}
アプリを実行して画面を回転すると (アクティビティが破棄されて再作成されます)、LogCat の内容は次のようになります。
... I/StateChange: onCreate <-- everything is normal in the first creation
... I/StateChange: onDestroy
... I/StateChange: onCreate <-- when lifecycle restarts (rotate screen)
... I/StateChange: onCreate <-- those use Timber will get logged twice
... I/StateChange: onDestroy <-- but those use standard log remain normal
... I/StateChange: onCreate <-- rotate again
... I/StateChange: onCreate <-- same problem, but only twice
いずれにせよ、これは Timber の私の最初の使用であり、状況を処理するためにどこかにコードを配置する必要があるかどうかはわかりません。これは無害に思えますが、私が現在行っているプロジェクトでは、LogCat パネルから多くのデバッグを行っており、アプリをデバッグするために 2 倍の情報を確認するのは非常に面倒です。