-1

在我的 Android 项目开发过程中,我遇到了鼓励使用 Timber 日志库的情况;但是当我切换到使用它时,我发现一旦我放置的活动 Timber.plant(new Timber.DebugTree());重新启动其生命周期(第二次调用onCreate(savedInstanceState)),Timber 生成的所有日志都会在 LogCat 面板中生成两次。

这个简单的代码说明了这个问题:

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
    }
}

现在,当我运行应用程序并旋转屏幕(这将导致 Activity 销毁并再次重新创建)时,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 面板进行大量调试,并且查看两倍的信息来调试应用程序确实很麻烦。

4

2 回答 2

1

这是预期的行为。毕竟,每次创建活动时,您都在种植新的“调试树”。

而不是这样做,您应该有一个自定义Application类并覆盖该onCreate函数。在里面,只需种植“调试树”。

例如:

public class MyCustomApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Timber.plant(new Timber.DebugTree());
        ...
}

这样,Timber 调试树只会在应用程序初始化时“种植”。

于 2021-11-04T11:40:31.470 回答
1

您应该将 Timber 种植在 ApplicationonCreate()方法上,而不是 ActivityonCreate()方法上。否则,您可以将您的Timber.plant()方法包装成这样的条件:

if (Timber.treeCount() == 0) {
    Timber.plant(new Timber.DebugTree());   // plant a debug tree
}
于 2021-11-04T11:38:54.670 回答