본문 바로가기

Android

[Android]Otto(Event Bus) 간단 사용법

반응형

앱을 개발하다보면 한 액티비티에서 변경된 결과를 다른 액티비티나 프래그먼트에 알려줘야할 상황이 많이 있습니다.

static함수를 사용하거나 handler, interface 등을 통해 구현할 수 있지만, 저처럼 게으른 사람은 그것조차 귀찮습니다.


이런 귀차니즘을 해결할 수 있는 라이브러리가, Square에서 만든 Otto라는 이벤트버스 계열 라이브러리입니다.


단순하게 설명하면, 이벤트를 변경하는 곳에서 어떤 이벤트를 던지고


처리할 곳에서 이벤트를 받아서 작업을 하는 것입니다.


아래는 아주 간단하게 작성한 예제입니다.



우선 Gradle에 Otto 라이브러리를 추가합니다.


1
compile 'com.squareup:otto:1.3.7'
cs



Otto를 관리하는 싱글톤을 만듭니다.


1
2
3
4
5
6
7
8
9
10
public final class BusProvider extends Bus{
    private static final Bus BUS = new Bus();
 
    public static Bus getInstance() {
        return BUS;
    }
 
    private BusProvider() {
    }
}
cs




1개의 Activity에 ViewPager로 2개의 Fragment를 붙여둔 상황입니다.

버튼을 누르면 number를 1씩 증가시킨 후 각각의 Fragment에 던져줄겁니다.

BusProvider.getInstance().post(++number);

해당 코드를 통해 number를 1증가시킨 후 number를 이벤트로 던집니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public class MainActivity extends AppCompatActivity {
    @BindView(R.id.tabLayout) TabLayout tabLayout;
    @BindView(R.id.viewPager) ViewPager viewPager;
 
    FragmentAdapter fragmentAdapter;
    int number;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
 
        number = 0;
 
        fragmentAdapter = new FragmentAdapter(getSupportFragmentManager());
        viewPager.setAdapter(fragmentAdapter);
        tabLayout.setupWithViewPager(viewPager);
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
 
    class FragmentAdapter extends FragmentPagerAdapter {
        Fragment[] frags = new Fragment[]{
                new FirstFragment(),
                new SecondFragment()
        };
        String[] titles = new String[]{
                "First""Second"
        };
 
        public FragmentAdapter(FragmentManager fm) {
            super(fm);
        }
 
        @Override
        public Fragment getItem(int position) {
            return frags[position];
        }
 
        @Override
        public int getCount() {
            return frags.length;
        }
 
        @Override
        public CharSequence getPageTitle(int position) {
            return titles[position];
        }
    }
 
    @OnClick(R.id.otto_btn)
    public void ottoBtn() {
        // post로 던지는 parameter는 기본적으로는 어떤 것이든 가능합니다.
        // 다만, 받는 쪽에서는 기본형 data type이 아닌 참조형 data type으로 받아야합니다.
        // 여기서는 int형으로 기본형 data type을 파라미터로 보냈습니다.
        BusProvider.getInstance().post(++number);
        Log.d("Otto", number + "");
    }
}
cs



MainActivity에서 던진 이벤트를 받을 Fragment입니다.

BusProvider.getInstance().register(this);

BusProvider.getInstance().unregister(this);

이벤트를 감지하기 위해 Otto를 등록 및 해제하는 코드를 추가합니다.

@Subscribe라는 어노테이션을 통해

이벤트를 감지하고 수행할 method를 작성합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class FirstFragment extends Fragment {
    @BindView(R.id.first_fragment_text) TextView firstFragmentText;
 
    public FirstFragment() {
    }
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        BusProvider.getInstance().register(this);
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_first, container, false);
        ButterKnife.bind(this, view);
        return view;
    }
 
    @Override
    public void onDestroy() {
        super.onDestroy();
        BusProvider.getInstance().unregister(this);
    }
 
    // MainActivity에서 기본형 data type으로 보냈지만
    // int가 아닌 Wrapper class인 Integer로 파라미터를 지정하여 참조형 data type입니다.
    // 여기서 Integer를 int로 바꿔서 실행해보면
    // MainActivity에서 보낸 데이터를 받지 못하는 것을 확인할 수 있습니다.
    @Subscribe
    public void getPost(Integer number) {
        Log.d("First", number + "");
        firstFragmentText.setText(number + "");
    }
}

cs




끝입니다!!

이렇듯 Otto를 이용하면 코드를 간단하고 간결하게 작성할 수 있습니다.

아래의 영상은 동작화면입니다.





해당 예제 코드들은 https://github.com/NewLand-Ju/OttoStudy 에서 확인하실 수 있습니다.





반응형