Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否将捆绑包的内容打印到Logcat?_Java_Android_Logcat_Android Bundle - Fatal编程技术网

Java 是否将捆绑包的内容打印到Logcat?

Java 是否将捆绑包的内容打印到Logcat?,java,android,logcat,android-bundle,Java,Android,Logcat,Android Bundle,如果您记不起所有键的名称,是否有一种简单的方法将捆绑包的内容打印到Logcat(即使只打印键名称也很酷)应该可以 for (String key: bundle.keySet()) { Log.d ("myApplication", key + " is a key in the bundle"); } 如果你想得到这个对象,你可以使用。但是,请记住使用通用的get()调用: 您正在使用对象。如果您只是打印到日志,将调用toString(),一切都会正常。但是,如果确实要使用密钥对,则需

如果您记不起所有键的名称,是否有一种简单的方法将
捆绑包的内容打印到Logcat(即使只打印键名称也很酷)

应该可以

for (String key: bundle.keySet())
{
  Log.d ("myApplication", key + " is a key in the bundle");
}
如果你想得到这个对象,你可以使用。但是,请记住使用通用的
get()
调用:

  • 您正在使用对象。如果您只是打印到日志,将调用
    toString()
    ,一切都会正常。但是,如果确实要使用密钥对,则需要执行
    instanceof
    检查以避免调用错误的方法
  • 由于toString将被调用,如果您有一个特殊的对象(例如ArrayList或特殊的Serializable/Parcelable extras),则很可能无法从打印输出中获得任何有用的内容

您可以通过如下方式打印映射值来获得更具体的信息:

for (String key : bundle.keySet())
{
    Log.d("Bundle Debug", key + " = \"" + bundle.get(key) + "\"");
}

捆绑到字符串转换器:

public static String bundle2string(Bundle bundle) {
    if (bundle == null) {
        return null;
    }
    String string = "Bundle{";
    for (String key : bundle.keySet()) {
        string += " " + key + " => " + bundle.get(key) + ";";
    }
    string += " }Bundle";
    return string;
}
用法示例:

Log.d(TAG,"details="+bundle2string(details));
和输出:

details=Bundle{ RESPONSE_CODE => 5; }Bundle

请注意,箭头
=>
和分号
允许您在键和值中提及空格。箭头前一个空格、箭头后一个空格、分号前无空格、分号后一个空格、
{
后一个空格和
}
前一个空格,所有其他空格都在那里,因为它们在键或值中。

我开发了一个名为
pretty print
的库,该库的注释处理器以漂亮的表格格式打印包的内容。 一定要去看看

在Kotlin中,当包含子捆绑包时递归:

/**
 * Recursively logs the contents of a [Bundle] for debugging.
 */
fun Bundle.printDebugLog(parentKey: String = "") {
    if (keySet().isEmpty()) {
        Log.d("printDebugLog", "$parentKey is empty")
    } else {
        for (key in keySet()) {
        when (val value = this[key]) {
                is Bundle -> value.printDebugLog(key)
                is Array<*> -> Log.d("printDebugLog", "$parentKey.$key : ${value.joinToString()}")
                else -> Log.d("printDebugLog", "$parentKey.$key : $value")
            }
        }
    }
}
/**
*递归地记录[Bundle]的内容以进行调试。
*/
fun Bundle.printDebugLog(parentKey:String=”“){
if(keySet().isEmpty()){
Log.d(“printDebugLog”,“$parentKey为空”)
}否则{
对于(输入键集()){
何时(val值=此[键]){
是Bundle->value.printDebugLog(键)
是Array->Log.d(“printDebugLog”,“$parentKey.$key:${value.joinToString()}”)
else->Log.d(“printDebugLog”,“$parentKey.$key:$value”)
}
}
}
}

用法:
myBundle.printDebugLog()

意识到这并不能准确回答问题,但我看到很多开发人员试图将内容转储到logcat/console,因为他们不知道可以在Android Studio调试器中设置,以便在调试时,当遇到断点时显示自定义对象渲染。对于Bundle,您可以采用此处其他答案中显示的代码类型,并将其作为自定义呈现程序应用,这样您就不需要将转储通过管道传输到logcat和/或控制台

(这些说明来自Android Studio 3.1.3(2018年6月)

  • 选择“文件”,然后选择“设置”菜单选项/子选项
  • 在“设置”对话框的左侧,向下钻取并选择“构建、执行、部署”、“调试器”、“数据视图”、“Java类型渲染器”
  • 对话框右侧显示“渲染器名称”,请输入要与正在创建的渲染器标识的名称
  • 对话框右侧显示“将渲染器应用于类型的对象”,输入“android.os.Bundle”
  • 在对话框右侧的“渲染节点时”部分下,选择“使用以下表达式:”单选按钮
  • 在该字段下方的文本字段中,键入以下内容
  • 按“应用”/“确定”按钮
  • 现在,当您运行应用程序时,遇到一个断点,该断点显示一个类型为android.os.Bundle的变量,您将在调试器窗口的变量部分看到由上述代码生成的输出

    我还将包括一个屏幕截图,显示我上面描述的内容…

    Kotlin解决方案:

    val bundleFromNotifications: Bundle? = remoteMessage?.toIntent()?.extras
    bundleFromNotifications?.keySet()?.forEach{
        Log.d(LOG_TAG, it + "=> \"" + bundleFromNotifications.get(it) + "\"")
    }
    
    Kotlin溶液:

    fun Bundle.toPrintableString(): String {
        val sb = StringBuilder("{")
        var isFirst = true
        for (key in keySet()) {
            if (!isFirst)
                sb.append(',')
            else
                isFirst = false
            when (val value = get(key)) {
                is Bundle -> sb.append(key).append(':').append(value.toPrintableString())
                else -> sb.append(key).append(':').append(value)
                //TODO handle special cases if you wish
            }
        }
        sb.append('}')
        return sb.toString()
    }
    
    val bundleToString = bundle.keySet()
                .joinToString(", ", "{", "}") { key ->
                    "$key=${bundle[key]}"
                }
    
    样本:

        val bundle = Bundle()
        bundle.putString("asd", "qwe")
        bundle.putInt("zxc", 123)
        Log.d("AppLog", "bundle:${bundle.toPrintableString()}")
    

    请注意,它不会处理所有可能的值类型。您应该决定哪些值需要显示以及以何种方式显示。

    Kotlin中的简单捆绑到字符串实现:

    fun Bundle.toPrintableString(): String {
        val sb = StringBuilder("{")
        var isFirst = true
        for (key in keySet()) {
            if (!isFirst)
                sb.append(',')
            else
                isFirst = false
            when (val value = get(key)) {
                is Bundle -> sb.append(key).append(':').append(value.toPrintableString())
                else -> sb.append(key).append(':').append(value)
                //TODO handle special cases if you wish
            }
        }
        sb.append('}')
        return sb.toString()
    }
    
    val bundleToString = bundle.keySet()
                .joinToString(", ", "{", "}") { key ->
                    "$key=${bundle[key]}"
                }
    

    结果示例
    {id=3,name=“Jhon”}

    Java8流一行程序:

    bundle.keySet().stream().forEach(k -> Log.d(TAG, k + " = " + bundle.get(k)));
    

    我想你的意思是
    bundle.keySet()
    (因为你的文档链接很好);否则这是正确的。@Eric gah,愚蠢的错误。至少我链接到它时拼写正确。这是一个很好的解决方案,但我宁愿使用StringBuffer以获得更好的性能:
    公共静态字符串bundle2string(bundle bundle){StringBuffer buf=newstringbuffer(“Bundle{”);for(字符串键:Bundle.keySet())buf.append(“+key+”=>“+Bundle.get(key)+“;”);buf.append(}Bundle”);return buf.toString();}
    IMO性能与bundleString()的用途无关,但即使我们假设相反,根据,字符串连接由编译器转换为StringBuilder操作。我没有亲自检查Android;如果有人想检查这一点,请确认或反驳。@Maurix因为没有涉及线程,StringBuilder比StringBuffer好:请注意,有些值不包含多行,所以在一个日志条目中打印所有行可能会有问题。这是Android Studio的一个非常简洁的功能,我不知道它的存在。谢谢!@Julian a。不客气。是的,我一直很惊讶它没有被更多地谈论,并且希望不包括为常用类预先创建的表达式如果使用Android Studio,将节省一些时间。仅供参考,Eclipse对于使用该IDE的用户也有类似的功能。谢谢,它可以工作。按键按字母顺序排列(
    keySet()
    返回已排序的集合)。