首页 > 解决方案 > Android Timber 多次记录

问题描述

考虑以下简单设置。1 个片段和 1 个 ViewModel:

分段

class TestFragment : Fragment() {

    private val viewModel by lazy {
        ViewModelProviders.of(this).get(TestViewModel::class.java)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_test, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewModel.testLiveData.observe(viewLifecycleOwner, androidx.lifecycle.Observer {
            Log.d("###", "whattt")
        })
    }
}

视图模型

class TestViewModel : ViewModel() {

    private val myVariable = Log.d("###", "Test")

    val testLiveData = MutableLiveData(false)
}

为什么我从 Fragment 和 ViewModel 都获得了最多 3 次的日志输出?

D/###: Test
D/###: whattt
D/###: Test
D/###: Test
D/###: whattt
D/###: whattt

标签: androidkotlinandroid-architecture-componentsandroid-livedataandroid-viewmodel

解决方案


在@tynn 发表评论后,我意识到问题可能来自在片段实际涉及之前发生的一些操作。长话短说:我有一个多模块项目:1 个应用程序模块、1 个数据模块和 1 个网络模块。网络模块和应用程序模块都在种植 Timber DebugTree ...所以所有内容都记录了两次facepalm

如果有一个好方法可以在这方面保持模块独立,我进行了一些搜索。我唯一能找到的就是这个答案:

https://stackoverflow.com/a/53872754/990129

object TimberLogImplementation {

    fun initLogging() {
        if(Timber.treeCount() != 0) return
        if (BuildConfig.DEBUG) Timber.plant(DebugTree())
        else Timber.plant(ReleaseTree())
    }

}

推荐阅读