[Java][初心者] コールバック実装のサンプルコード

 今回はアプリ開発で必須とされる技術要素のコールバックについての解説、サンプル実装を書きました。

コールバックとは?


 他のクラスや関数に引数として渡される関数オブジェクトのことだ。

 以下のような使い方をよくする。

  • 非同期処理が完了した後に実行してほしい処理をコールバックとして渡す
  • ボタン押したときにしてほしい処理をコールバックとして渡す

 以下の画像は、アプリでボタンを押したらサーバーアクセスして処理を非同期実行、終わったらコールバック実行という場合のイメージだ。

 例えば、ボタンが押された時の処理はこんな感じだ。

  1. OnClickListenerインターフェースをimplementsしたクラスに処理を記載
  2. そのクラスのオブジェクトをsetOnClickListenerでボタンに設定する
  3. ボタンが押されたら、2.のクラスに記載された処理が実行される

 この処理のsetOnClickListenerで設定する、OnClickListenerインターフェースを実装したオブジェクトのことをコールバックと呼ぶ。

Javaでコールバックをサンプル実装


 今回の例は、非同期処理の実行が終わった後にしてほしい処理をコールバックで渡すといった内容。

 まずは、非同期処理終了時に呼びたいCallbackのインターフェースを定める。

/**
 * コールバックインターフェース
 */
interface AsyncFunctionCallback {
    // 成功したらisSucceedにtrueを渡すようにする
    void onAsyncFunctionFinished(boolean isSucceed);
}

 次にメイン関数。今回のサンプルプログラムはこんな感じ。

  1. AsyncFunctionCallback継承クラスオブジェクトを無名クラスで定義、処理を実装
  2. 非同期処理のasyncFunctionを実行。1.のコールバックを渡す。
  3. 非同期処理が完了したら1.のコールバックを実行

 実行結果は以下の感じになる。Async function finishedは1秒後に遅れてコールバックから呼ばれる。

非同期処理実行中...
別スレッドで非同期処理開始
Async function finished.
import java.util.*;

public class Main {
    interface AsyncFunctionCallback {
        void onAsyncFunctionFinished(boolean isSucceed);
    }
    
    public static void main(String[]args){
        // 無名クラスでコールバックオブジェクトの定義
        AsyncFunctionCallback callback = new AsyncFunctionCallback() {
            // コールバック処理の定義
            @Override
            public void onAsyncFunctionFinished(boolean isSucceed) {
                System.out.println("Async function finished.");
            }
        };
        asyncFunction(callback);  // 非同期処理実行
        System.out.println("非同期処理実行中...");
    }
    

    private static void asyncFunction(AsyncFunctionCallback callback) {
        // 新しいスレッドを生成して非同期処理する
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("別スレッドで非同期処理開始");
                try {
                    Thread.sleep(1000); // 1秒処理を止める
                    // 処理が終わったらコールバックを呼び出す
                    callback.onAsyncFunctionFinished(true);
                } catch (InterruptedException e) {
                    // 処理失敗したらコールバックにfalse渡す
                    callback.onAsyncFunctionFinished(false);
                }
            }
        });
        t.setDaemon(false);
        t.start();
    }
}

 

コメントを残す

メールアドレスが公開されることはありません。