본문 바로가기

개발관련 정보/안드로이드

메소드 버스 활용하기

오랜만에 글을 쓰네요~

 

앱을 개발하면서 핸들러를 자주 쓰게 됩니다.

하지만 너무 많은 핸들러를 쓰게 되면, 예상치 못한 문제가 생기게 됩니다. 

 

그럼 핸들러 대신 메소드 버스라는 콜백 메소드를 활용하는 방법을 한번 확인해 보겠습니다.

 

사용법은 아래 소스예시와 같이, 콜백 메소드 클래스 선언 후 사용하게 됩니다.

package com.kbins.kbinsure;

import java.util.concurrent.Callable;

/**
 * 메소드 버스 클래스
 *
 * Created by James Hong on 2018,October,22
 */
public class CallMethodObject implements Callable<Object> {
    public Object value;

    public CallMethodObject() {

    }

    public void setValue(Object value) {
        this.value = value;
    }

    public Object getValue() {
        return this.value;
    }

    @Override
    public Object call() throws Exception {
        return this.value;
    }
}

 

위와 같이 CallMethodObject라는 클래스를 Callable를 implements하여 생성하고,

컨스트럭트 메소드와, call() 메소드를 필수로 생성하고, 나머지 값을 전달이나, 기타 처리를 위한 메소드를 생성합니다.

 

public static void openSubContents(Activity activity, String url, CallMethodObject callMethodObject) {
    myLog.d(TAG, "*** openSubContents - url:"+url);

    if(!openOutSideBrowser(activity, url)) {

        try {
            callMethodObject.setValue(url);
            callMethodObject.call();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

어떤 처리를 한 뒤에 콜백메소드를 호출하게 되고

이 메소드는 아래와 같이 호출하게 됩니다.

Common.openSubContents(this, url, new CallMethodObject() {

    @Override
    public Object call() {

        Intent intent = new Intent(MainActivity.this, SubContent.class);

        intent.putExtra("url", (String) value);
        intent.putExtra("menu_id", menuId);
        intent.putExtra("action", action);

        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

        startActivityForResult(intent, Constant.RETURN_FROM_SUB_CONTENT);

        return null;
    }
});

 

call()메소드 내에서 호출되는 코드는 메인 스레드에서 수행되게 되어 때에 따라서 핸들러와는 달리 결과의 처리가 다른 형태로 수행되게 됩니다.

 

항상 웃으며~ 좋은시간 보내시기 바랍니다.