Android Study

CallbackListener interface 활용한 함수 동기화시키기

85chong 2020. 2. 20. 16:03
728x90
반응형
SMALL

<예제 상황>

- MainActivity.java
- Aclass.java

1. MainActivity 에서 Aclass 있는 funA()를 호츨한다.
2. Aclass 에 있는 funB()를 호출한다.
3. MainActivity 에서 funC()를 호출한다.
*단 funB()는 10초후에 호출된다.

그럼 위의 상태는 현재 비동기식 상태라 출력하면
funA()
funC()
10초후
funB()

이렇게 나옴, 위를 해결하기 위해서 onActivityResult()도 활용하거나, 아예 클래스를 변경해서 Aclass 에서 funB() funC() 를 모두 생성해서 로직을 바꾼다던가
하는 방법 들이있다. 그런데 이 방법등을 사용하게 되면 기존 로직이 흐트러지거나, 이 로직으 위해 다른 로직이 복잡해 질수도 있다.
그래서 callback 함수를 만들어 활용하는것이 좋다.





[MainActivity.java]

public class MainActivity extends AppCompatActivity { 

    Aclass aclass; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 

        //1. Aclass 인스턴스 생성 
        aclass = new Aclass(this); 

        //2. Aclass , funA() 를 호출한다.(->Aclass.java 이동) 
        aclass.funA(); 

        //6. callback 리스너를 호출받는다. 
        aclass.setCallbackListener(new Aclass.AclassCallbackListener() { 
            @Override 
            public void aclassCallback() { 
                //7. funC()를 실행시켜준다. -끝- 
                funC(); 
            } 
        }); 
    } 

    public void funC(){ 
        Log.d("yck","funC()"); 
    } 

}//class end 








[Aclass.java]

public class Aclass { 
    AclassCallbackListener aclassListener; 
    Context context; 

    public Aclass(Context context) { 
        this.context = context; 
    } 

    //3.funA() 가 호출된다 
    public void funA(){ 
        Log.d("yck","funA()"); 
        //3. 3초 delay 가 걸린다. 
        delay(); 
    } 

    public void delay() { 
        int delayTimeMils = 3000;//딜레이 3초 
        Handler handler = new Handler(Looper.getMainLooper()); 
        handler.postDelayed(new Runnable() { 
            @Override 
            public void run() { 
                //4. 3초 딜레이 후 funB()를 호출한다. 
                funB(); 
                //5. MainActivity 에서 인스턴스 생성한 직접만든 callback리스너를 호출한다.(->MainActivity로 이동) 
                aclassListener.aclassCallback(); 
            } 
        }, delayTimeMils); 
    } 

    public void funB(){ 
        Log.d("yck","funB()"); 
    } 

    //Aclass 에서 직접 만든 callback listener interface 
    interface AclassCallbackListener{ 
        void aclassCallback(); 
    } 

    public void setCallbackListener(AclassCallbackListener aclassListener){ 
        this.aclassListener = aclassListener; 
    } 

}//class end