본문 바로가기

Android/통신

[안드로이드] 프래그먼트(Fragment)에 데이터 전달 하는 법 ― EventBus사용하여 데이터 전달하기

728x90
반응형

Fragment에 데이터 전달하기


 

Fragment에 데이터를 전달하여 setText 하는 방법을 고민하던 중 EventBus라는  좋은 라이브러리를 알게 되었습니다.

특히 저는 스레드에서 프래그먼트에 데이터를 전달해야 하였는데 아주 좋은 솔루션이였죠.

이벤트 버스 라이브러리는

  • Fragment  ↔  Fragment
  • Fragment  ↔ Activity
  • Fragment  ↔  Thread
  • Fragment  ↔  Service

     등등 . . . . . . . . .

전부 전역단위로 데이터 송/수신이 가능합니다.

또한 비동기식 데이터(주로 통신 데이터)를 즉각적으로 Callback 받을 수 있다! 는 장점이 있죠.

저 같은 경우는 ViewPager로 Fragment를 관리하였고, Activity의 Thread에서 보낸 데이터를 ViewPager 안의 특정 Fragment에 전달이 가능하였습니다.

즉, 어디든 상관없이 데이터 전달이 가능한것 같습니다 ^^

단점은 너무 많이 쓰면 관리가 힘들어 데이터 충돌등의 위험이 있다 하네요.


 

 

 

Gradle


dependencies {
	...
	implementation 'org.greenrobot:eventbus:3.0.0'
    ...
}

먼저 build.gradle(Module: app)에 eventbus를 사용하기위해 추가해 주세요.

 


Data Class


전역 부분에 EventBus Class를 추가해줍니다. 저는 MainActiviy에 DataEvent라는 이름으로 추가 해 두었습니다.

원하는 Data 형식에 맞는 class를 만들어 주면 됩니다. 저는 String을 옮길거에요.

public static class DataEvent {

    public final String helloEventBus;

    public DataEvent(String helloEventBus) {
       this.helloEventBus = helloEventBus;
    }
}

 


 

 

Fragment(데이터 받는 부분)


EventBus를 쓰기위해서 데이터 받는 부분(저는 Fragment)에 밑의 소스를 추가해줍니다.

try{
    EventBus.getDefault().register(this);
}catch (Exception e){}

onCreate에 추가해주었습니다.

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        try{
            EventBus.getDefault().register(this);
        }catch (Exception e){}

    }

 

그 다음 해당 class 안에 이벤트를 받는 메소드를 작성해줍니다.

@Subscribe(threadMode = ThreadMode.MAIN)
public void testEvent(MainActivity.DataEvent event){

    setDataString(event.helloEventBus);
}

threadMode를 메인으로 설정 하여 이벤트 받은 후 작업을 메인 쓰레드에서 하게 됩니다. 그러므로 이벤트 보내는 곳이 스레드나 서비스일때도 처리될 수 있습니다.

 

 


 

데이터 보내기


EventBus.getDefault().post(new DataEvent(dataString));

이제 데이터를 보내고 싶을 부분에 위의 구문만 추가해주면 이벤트 받는 메소드 부분으로 이벤트를 전달해주게 됩니다.

어디서든지 위 구문을 추가하면 Subscribe하고 있는 메소드에 이벤트를 전달해 줄 수 있습니다.

 


 

EventBus 해제


try{
            EventBus.getDefault().unregister(this);
 }catch (Exception e){}

위의 구문을 해제하기 위해 추가해줍니다. 주로 생명주기가 끝날 때나 이벤트를 받기 원하지 않을 때 추가해주면 됩니다.

Fragment onStop에 추가하였습니다.

@Override
public void onStop() {
    super.onStop();
    try{
        EventBus.getDefault().unregister(this);
    }catch (Exception e){}
}

 

 

 

 

 

728x90
반응형