常在河边走,哪有不湿鞋!常在Android开发,哪有不遇到奇怪Bug的,但是这Bug也太奇葩了吧,都不知道什么原因,真是气死人不偿命!
事情是怎么回事呢?我有一个类叫IMSDroid,进行了一些Log输出:
public class IMSDroid extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.i("IMSDroid", "onCreate");
}
}
当然了,我真实开发中打印的是一些更有用的信息,但是死活看不到Log呀,以为是程序哪里出了问题,怎么看也没问题的,于是用Toast进行显示:
public class IMSDroid extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.i("IMSDroid", "onCreate");
Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
}
}
发现Toast能显示出来,说明onCreate方法是执行了的,为什么Log不显示呢?但我在MainActivity类中打印的Log是有显示的,依稀记得以前也有在Application类中打印过Log是可以显示的,为什么这次就不行了呢?找了许久的原因,后来想到既然在Activity中可以打印,那就把那行Log复制到Activity中试试吧:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.e("MainActivity", "onCreate")
Log.i("IMSDroid", "onCreate")
}
}
终于有答案了,就是TAG出了问题,不能使用“IMSdroid”做为TAG,如果用它做TAG就会看不到输出,后来我再经过多翻折腾,发现了其实是不能使用“IMS”这3个字符开头作为TAG,我是怎么验证的呢,我们知道ASCII码共有127个,那就一个个试吧,代码如下:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.e("MainActivity", "----------------------------------")
(0 .. 127).forEach {
val str = "IMS${it.toChar()}"
Log.i(str, str)
}
Log.e("MainActivity", "----------------------------------")
}
这时,你只会看到输出了两条横线,这说明了以“IMS”打头的Log都没法输出。只要不是“IMS”打头就可以,把上面代码中的关键一行调一下字符串的拼接顺序:
val str = "${it.toChar()}IMS"
这时再运行,就能看到127行的Log输出了。
这是android系统的Bug无疑了,为什么我这么倒霉让我遇到了,浪费我好多宝贵的青春年华,知道了这个对我的技术又没什么提升,实属纯倒霉!!