読者です 読者をやめる 読者になる 読者になる

【android】apiへリクエストしてcallbackを実装する方法メモ

はじめに

android調べながらやってるけどJavaの基礎もあんまないから時間かかる。
今回やりたいのはapiたたいてレスポンスによって成功用と失敗用のcallbackを実行するようなこと。
調べたり質問しながらやってるけどinterface使うといいらしい。

実装1

呼び出し側に成功時と失敗時のコールバック用インターフェスを実装させる。
すっきりしてる気もするけど、コールバックを必ず実装させなければならないのがちょっと嫌かも。

ApiManager.java(呼ばれる側)

public class ApiManager {
    public interface ApiManagerCallback {
        public void success(Object obj);
        public void failed(Object obj);
    }

    private ApiManagerCallback apiManagerCallback;

    public void setCallbacks(ApiManagerCallback apiManagerCallback) {
        this.apiManagerCallback = apiManagerCallback;
    }

    public void callApi() {
        try {
            apiManagerCallback.success("success");
        } catch (Exception e) {
            apiManagerCallback.failed("failed");
        }
    }
}

MainActivity.java(呼び出す側)

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

       ApiManager apiManager = new ApiManager();
       apiManager.setCallbacks(this);
       apiManager.callApi();
   }

   public void success(Object obj) {
       // 成功
   }

   public void failed(Object obj) {
       // 失敗
   }
}

実装2

実装1より呼び出す側のコードが少し見辛い気もするけど、失敗時のコールバックが必須でないのがいいかも。

ApiManager.java(呼ばれる側)

public class ApiManager {
    public interface ApiManagerCallback {
       void call(Object obj);
    }

    void connect(final ApiManagerCallback success, final ApiManagerCallback failed) {
        try {
            success.call("success!!");
        } catch (Exception e) {
            if (failed != null) {
                failed.call("failed");
            }
        }
    }
}

MainActivity.java(呼び出す側)

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

        ApiManager apiManager = new ApiManager();
        apiManager.connect(new ApiManager.ApiManagerCallback() {
            @Override
            public void call(Object obj) {
                // 成功
            }
        }, new ApiManager.ApiManagerCallback() {
            @Override
            public void call(Object obj) {
                // 失敗
            }
        });
    }
}

きっともっといい書き方あるんだろうけど、自分の頭ではこんなものかな。難しい。。。もっといい書き方教えてください。以上です