Android更好的打印方式Timber使用简单记录

Timber进行打印,好处是使用简单,不用输入tag(tag自动为打印位置类的类名),并且可以一开始就设置是否打印,相当于有个控制打印的总开关。

 

一、引入依赖:

compile 'com.jakewharton.timber:timber:4.5.0'

 

二、gradle如下设置:

            android {
                buildTypes {
                    ...
                    release {
                        ...
                        debuggable false
                    }
                    debug {
                        ...
                        debuggable true
                    }
                }
            }

 

 

三、TimberUtil.java工具类:

package com.dway.utils;

import android.os.Environment;
import android.util.Log;

import com.dway.test.BuildConfig;

import java.io.File;

import timber.log.Timber;

/**
 * Timber打印开关工具类
 * 注意:1、需要依赖Timber,如:compile 'com.jakewharton.timber:timber:4.5.0'
        2、gradle中设置如下:
            android {
                buildTypes {
                    ...
                    release {
                        ...
                        debuggable false
                    }
                    debug {
                        ...
                        debuggable true
                    }
                }
            }
 * 使用:1、设置:Application设置下打印的模式
 *       2、打印:例如Timber.v("---onCreate---");打印的Tag会自动设置为代码所在的类名
 * Created by dway on 2017/8/9.
 */

public class TimberUtil {

    private final static String LOG_FILE_PATH = Environment.getExternalStorageDirectory().getPath() + File.separator + "log.test";

    /**
     * 设置log始终打开,可以在Application的onCreate中设置
     */
    public static void setLogDebug(){
        Timber.plant(new Timber.DebugTree());
    }

    /**
     * 设置log自动在debug打开,在release关闭,可以在Application的onCreate中设置
     */
    public static void setLogAuto(){
        if (BuildConfig.DEBUG) {//debug版本
            Timber.plant(new Timber.DebugTree());
        } else {//release版本
            Timber.plant(new CrashReportingTree());//打印关,同时gradle中的release的debuggable要设置为false
        }
    }

    /**
     * 设置log自动,并且想在release时仅在测试时有打印,
     * 在release版本时增加判断磁盘目录下是否存在文件 log.test,
     * 测试时让测试人员在磁盘目录下建立这么个文件。
     * 注意,如果读取存储需要权限申请的话,需要先获得权限,才能调用
     */
    public static void setLogAutoEx(){
        if (BuildConfig.DEBUG) {//debug版本
            Timber.plant(new Timber.DebugTree());
        } else {//release版本
            File logFile = new File(LOG_FILE_PATH);
            if(logFile.exists()){
                Timber.plant(new Timber.DebugTree());//打印开
            }else {
                Timber.plant(new CrashReportingTree());//打印关,同时gradle中的release的debuggable要设置为false
            }
        }
    }

    private static class CrashReportingTree extends Timber.Tree {
        @Override
        protected void log(int priority, String tag, String message, Throwable t) {
            if (priority == Log.VERBOSE || priority == Log.DEBUG) {
                return;
            }
            //FakeCrashLibrary.log(priority, tag, message);
            if (t != null) {
                if (priority == Log.ERROR) {
                    //FakeCrashLibrary.logError(t);
                } else if (priority == Log.WARN) {
                    // FakeCrashLibrary.logWarning(t);
                } else {

                }
            }
        }
    }

}

 

 

四、使用,一般Application中设置后,其他地方可以任意使用:

public class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        
        //设置log自动在apk为debug版本时打开,在release版本时关闭
        TimberUtil.setLogAuto();
        //也可以设置log一直开
        //TimberUtil.setLogDebug();
        
        //打印tag为类名
        Timber.v("---onCreate---");
    }

}

设置为auto模式,那么在打包release的apk时,就能自动去掉了打印,平常debug时则可以看到打印信息。

 

五、也可以自己封装一个简单的打印工具类LogUtil,使用更简单,不需要任何依赖。

LogUtil工具类请参考另一篇博文 https://blog.csdn.net/lin_dianwei/article/details/82662653

 

Android中,ViewModel和Fragment的结合通常用于管理Activity或Fragment之间的数据状态,尤其是当涉及到复杂的数据流或需要缓存数据以便于性能优化的情况。如果你在嵌套Fragment时,Activity并未看到ViewModel更新后的数据,可能有以下几个原因: 1. **绑定错误**:确保你在Fragment中正确地绑定了ViewModel,通常是通过`setViewModel()`函数设置,并监听`LiveData`的变化。 ```java val viewModel = ViewModelProvider(this).get(MyViewModel::class.java) binding.lifecycleOwner = viewModel // 对于Jetpack Compose viewModel.data.observe(viewLifecycleOwner) { updatedData -> // 更新UI操作 } ``` 2. **生命周期管理**:如果Fragment不是由ViewModel启动的,那么它可能不会自动观察ViewModel的状态变化。你需要手动触发观察或者在适当的地方调用`notifyDataSetChanged()`等方法来更新界面。 3. **数据传递延迟**:如果数据更新发生在ViewModel的后台线程,而UI更新是在主线程,可能会导致短暂的不一致。你可以考虑在ViewModel中使用`runOnMain()`, `postValue()`等方法来同步更新UI。 4. **观察者取消**:在Fragment销毁时,确保取消对ViewModel的观察,避免内存泄漏。 5. **ViewModel的作用范围**:若在跨Fragment共享ViewModel时,记得选择正确的ViewModel类型(如SingleLiveEvent,HierarchicalViewModel),并确认ViewModel是否被正确地保存和恢复。 如果以上都没问题,检查一下日志或者使用如` Timber `或` Android Monitor `之类的工具,找出数据更新的具体位置,看看是否有异常或者预期的行为未发生。同时,别忘了检查`Related Question`部分的问题以深入了解可能的原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值