【Android】Can’t toast on a thread that has not called looper.prepare()エラー解決法【Java】

#Android
writtdden by 上様

初めまして。

Android開発初心者の上様です。

最近は温度差がひどく、毎日服を選ぶのが大変です…。
桜もちらほら開花しているのが見れて、卒業、入学などを思い返しますね!

そんなところで本題に入っていきます。
業務中に遭遇したクラッシュの内容が「難しい!何を言ってるんだ?」と思ったので、

今回はご紹介させていただきます。

発生したエラー(AndroidStudio Log)

Can't toast on a thread that has not called Looper.prepare()

使用環境

AndroidStudio 2022.1.1 Patch 1

使用言語 Java

Emulator Pixel 6

クラッシュ発生時の状況

SQLiteを使ってDBにデータの保存削除などを行った際に、
完了の通知としてToastを使用してお知らせしようとしたところエラー出力。

AndroidStudioのログにて確認いたしました。

原因

  • Toastはメインスレッドでのみ実行できるというもの。
  • 私はサブスレッドで実行している。

要はメインスレッドで実行するか、紐づけが必要って言われているらしく、クラッシュが発生しているようでした。

スレッドについての詳細は以下サイトを参考にしましたので、ご確認ください。

プロセスとスレッドの概要

対処方法

Handlerクラスを使ってメインスレッドで実行すれば解決!!

/* MainActivity.java */ private void ScheduleProcess(){   Handler handler = new Handler();   counter = 0;  timer = new Timer();  timer.schedule(new TimerTask(){  @Override   public void run(){     handler.post(new Runnable() {       public void run() {        //実行処理を記載        deleteToast(); //トースト処理へ      }      });   } },10000);//10秒の遅延 }

今回は定期処理を実装したくてやってみた内容になります。

今回の内容に深く関わってくるのが以下のコード

@Override
public void run(){
    handler.post(new Runnable() {
        public void run() {
         //実行処理を記載
           deleteToast(); //トースト処理へ
        }
    });
}

handler.postの処理はnew Handler()したスレッドで実行されるので、メインスレッドでnew Handler()を実行する必要があります。

Handler handler = new Handler();

をメインメソッドで実行するか、privateで指定してあげてもいいと思います。

//例
private Handler mHandler = new Handler();

「10秒後に処理を実行したい!」とか、そういう要件に使用するのがHandlerクラスというイメージで使っています。
Toast部分ではif文を使って指定回数繰り返す処理を記載して僕本来の目的の定期処理、遅延処理も正常に動作いたしました。
(考えていることは簡単でもなんで実装しようとすると途端に難しいってなるんですかね笑)

最後に

電卓アプリの作成から始まりましたが、理解しエラーに対処するという技術も付き始めたのではないかと思っております。
時代も進み、AIがプログラムを書くだけではなく考え指摘することなどが注目される現在ですが、
大前提の知識や経験は、何事も理解する時や使っていくなかで必要なことですので、一緒に頑張っていきましょう!

ではでは、皆様も体調に気を付けてお過ごしください。ノシ­

Favorite