KDP(電子出版)のメモ 急急如律令

Amazon Kindleダイレクト・パブリッシングでの電子出版や電子書籍の作成販売について、文章やイラストの作成や編集方法について書いています。

log出力処理をhandlerを使って更新する

logをTextViewに表示したいが、logは他のクラスも呼び出しているのでちゃんと動くかが気になった。

この LogAppender クラスは、ログ出力のラッパーとして動作し、ログを Android の Log.d() に出力するとともに、指定された TextView にもログを表示するユーティリティクラスです。

Handler を使って UI スレッドで TextView.append() を安全に実行している点がポイントです。

MainActivity での使い方 1. MainActivity.java の例

package io.github.kyukyunyorituryo.aozoraepub3;

import android.os.Bundle;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import io.github.kyukyunyorituryo.aozoraepub3.util.LogAppender;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // ログを表示するTextViewを取得
        TextView logTextView = findViewById(R.id.textViewLog);

        // LogAppenderにTextViewをセット
        LogAppender.setTextView(logTextView);

        // ログの出力テスト
        LogAppender.println("アプリ起動");
        LogAppender.info(42, "情報ログ", "詳細情報");
        LogAppender.warn(100, "警告ログ");
        LogAppender.error(200, "エラーログ", "エラー詳細");
    }
}
  1. activity_main.xml のレイアウト例
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/textViewLog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="8dp"
        android:textSize="16sp"
        android:text="ログ出力エリア\n"
        android:background="#EEEEEE"/>
</LinearLayout>
  1. LogAppender の使い方のポイント LogAppender.setTextView(logTextView);

LogAppender に TextView をセットし、ログを UI に表示できるようにする。 LogAppender.println("アプリ起動");

append() メソッドを呼び出し、ログを TextView に追加する。 LogAppender.info(42, "情報ログ", "詳細情報");

"[INFO] 情報ログ (43) : 詳細情報" のように表示される。 LogAppender.warn(100, "警告ログ");

"[WARN] 警告ログ (101)" のように表示される。 LogAppender.error(200, "エラーログ", "エラー詳細");

"[ERROR] エラーログ (201) : エラー詳細" のように表示される。 4. Handler を使う理由 TextView.append(log); は UI の更新なので、メインスレッド (Looper.getMainLooper()) で実行する必要があります。 そのため、handler.post(() -> { textView.append(log); }) を使い、UIスレッドで処理を実行しています。

  1. まとめ LogAppender は、ログを Android の Log.d() と TextView の両方に出力できるクラス。 MainActivity で TextView を setTextView() で設定することで、UIにログを表示できる。 バックグラウンドスレッドからでも安全に UI を更新できるよう、Handler を利用している。