code

번들의 내용을 Logcat에 인쇄 하시겠습니까?

codestyles 2020. 11. 26. 08:18
반응형

번들의 내용을 Logcat에 인쇄 하시겠습니까?


Bundle모든 키의 이름을 기억할 수없는 경우 Logcat 에 a의 내용을 쉽게 인쇄 할 수있는 방법이 있습니까 (키 이름 만 인쇄 할 수 있어도 멋질 것입니다)?


Bundle # keySet () 가 작동합니다.

for (String key: bundle.keySet())
{
  Log.d ("myApplication", key + " is a key in the bundle");
}

그리고 Object를 얻으려면 Bundle#get(String key)(내 답변 상단에 링크 한 동일한 문서에도 있음) 사용할 수 있습니다 . 그러나 다음과 같은 일반 get()호출을 사용하십시오 .

  • Object로 작업하고 있습니다. 단순히 로그에 인쇄하는 toString()경우이 호출되고 모든 것이 정상입니다. 그러나 실제로 키 쌍을 사용 instanceof하려면 잘못된 메서드를 호출하지 않도록 확인 해야합니다 .
  • toString이 호출되기 때문에 특별한 Object (예 : ArrayLists 또는 특별한 Serializable / Parcelable 추가)가있는 경우 인쇄물에서 유용한 정보를 얻지 못할 가능성이 높습니다.

다음과 같이 매핑 된 값을 인쇄하여 더 구체적으로 얻을 수 있습니다.

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

화살표 =>와 세미콜론 ;을 사용하면 키와 값에 공백을 언급 할 수 있습니다. 화살표 앞 한 칸, 화살표 뒤 {}칸, 세미콜론 앞 한 칸, 세미콜론 뒤 칸, 뒤에 칸, 앞에 한 칸, 다른 모든 칸은 키 또는 값에 있기 때문에 존재합니다. .


이것이 질문에 정확히 답하는 것은 아니지만, 디버그 시간에 사용자 정의 된 개체 렌더링을 표시하도록 Android Studio 디버거에서 설정할 수 있다는 사실을 모르기 때문에 logcat / console에 콘텐츠를 덤프하려는 개발자가 많습니다. 중단 점에 도달했습니다. 그리고 Bundle의 경우 여기에 다른 답변에 표시된 코드 유형을 가져 와서 사용자 지정 렌더러로 적용 할 수 있으므로 덤프를 logcat 및 / 또는 콘솔로 파이프 할 필요가 없습니다.

(이 지침은 Android Studio 3.1.3 (2018 년 6 월)에서 가져온 것입니다.

  1. "파일"을 선택한 다음 "설정"메뉴 옵션 / 하위 옵션을 선택합니다.
  2. '설정'대화 상자의 왼쪽에서 드릴 다운하고 "Build, Execution, Deployment", "Debugger", "Data View", "Java Type Renderers"를 선택합니다.
  3. "렌더러 이름"이라고 표시된 대화 상자의 오른쪽에 만들고있는 렌더러와 식별 할 이름을 입력합니다.
  4. "Apply renderer to objects of type"이라는 대화 상자의 오른쪽에 'android.os.Bundle'을 입력합니다.
  5. 대화 상자 오른쪽의 "노드를 렌더링 할 때"섹션 아래에서 "다음 표현식 사용 :"라디오 버튼을 선택합니다.
  6. 그 아래의 텍스트 필드에 다음을 입력하십시오 ...
StringBuilder builder = new StringBuilder();
for (String key : ((android.os.Bundle)this).keySet()) {
    Object value = ((android.os.Bundle)this).get(key);
    builder.append("[");
    builder.append(key);
    builder.append("]=[");
    builder.append(value);
    builder.append("](");
    builder.append((value != null) ? value.getClass().getSimpleName() : "null");
    builder.append("), ");
}
return builder.toString();
  1. '적용'/ '확인'버튼을 누릅니다.

이제 앱을 실행하고 android.os.Bundle 유형의 변수를 표시하는 중단 점에 도달하면 디버거 창의 변수 섹션에 위 코드에서 생성 된 출력이 표시됩니다.

위에서 설명한 내용을 보여주는 스크린 샷도 포함하겠습니다. 스크린 샷


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()) {
            val value = this[key]
            when (value) {
                is Bundle -> value.printDebugLog(key)
                is Array<*> -> Log.d("printDebugLog", "$parentKey.$key : ${value.joinToString()}")
                else -> Log.d("printDebugLog", "$parentKey.$key : $value")
            }
        }
    }
}

용법: myBundle.printDebugLog()


pretty-print번들의 내용을 멋진 테이블 형식으로 인쇄하는 주석 프로세서 라는 라이브러리를 개발했습니다 . https://github.com/NULLPointerGuy/pretty-print를 확인 하십시오.


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 bundle = Bundle()
    bundle.putString("asd", "qwe")
    bundle.putInt("zxc", 123)
    Log.d("AppLog", "bundle:${bundle.toPrintableString()}")

가능한 모든 유형의 값을 처리하지는 않습니다. 어떤 것을 어떤 방식으로 보여줄지 결정해야합니다.

참고 URL : https://stackoverflow.com/questions/14948697/print-the-contents-of-a-bundle-to-logcat

반응형