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){}
}
'Android > 통신' 카테고리의 다른 글
[안드로이드] 아두이노와 안드로이드 Bluetooth 통신하기 (24) | 2020.05.08 |
---|---|
[안드로이드 Java] Bandpass Filter(BPF) 구현하기 ― BPF IIR library, FIR 코드 (2) | 2020.03.04 |
[안드로이드 Java] 디지털 신호 FFT(Fast Fourier Transform)하기― 다양한 FFT class와 JTransform library 사용, 비교 (14) | 2020.03.02 |
[안드로이드 Java] 하드웨어 모듈과 TCP/IP 소켓 통신 하기 ― 클라이언트 소켓 프로그래밍 (5) | 2020.02.12 |