번들의 내용을 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 월)에서 가져온 것입니다.
- "파일"을 선택한 다음 "설정"메뉴 옵션 / 하위 옵션을 선택합니다.
- '설정'대화 상자의 왼쪽에서 드릴 다운하고 "Build, Execution, Deployment", "Debugger", "Data View", "Java Type Renderers"를 선택합니다.
- "렌더러 이름"이라고 표시된 대화 상자의 오른쪽에 만들고있는 렌더러와 식별 할 이름을 입력합니다.
- "Apply renderer to objects of type"이라는 대화 상자의 오른쪽에 'android.os.Bundle'을 입력합니다.
- 대화 상자 오른쪽의 "노드를 렌더링 할 때"섹션 아래에서 "다음 표현식 사용 :"라디오 버튼을 선택합니다.
- 그 아래의 텍스트 필드에 다음을 입력하십시오 ...
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();
- '적용'/ '확인'버튼을 누릅니다.
이제 앱을 실행하고 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
'code' 카테고리의 다른 글
팝업 메시지 상자 (0) | 2020.11.26 |
---|---|
thead와 tbody 사이의 간격 (0) | 2020.11.26 |
Bash : 날짜 반복 (0) | 2020.11.26 |
onAttach ()가 Fragment에서 호출되지 않았습니다. (0) | 2020.11.26 |
java.lang.RuntimeException : com.android.builder.dexing.DexArchiveMergerException : Android Studio 3.0에서 dex를 병합 할 수 없습니다. (0) | 2020.11.26 |