[Android] Otto ตัวช่วยส่งข้อมูลผ่าน event bus

อย่างที่รู้กันในหมู่ Android Developer ว่า การคุยกันระหว่าง Activity กับ Fragment นั้นไม่ง่ายเลย แต่บทความนี้ผมจะยังไม่อธิบายว่าแตกต่างกันอย่างไร (ถ้าใครใจร้อนมี link ให้ครับ http://developer.android.com/guide/components/fragments.html)

วิธีพื้นบ้าน (No lib.)

เตรียมพร้อมด้วย communication interface ก่อน
    public interface OnFragmentInteractionListener {
        public void onFragmentInteraction(Data data);
    }

การใช้งานใน Fragment Class
    OnFragmentInteractionListener mListener;
    ...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mListener = (OnFragmentInteractionListener) activity;

    }
    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

ทำการส่งค่าจาก Fragment ไปยัง Activity
    @Override
    public void onClick(View v) {
        mListener.onFragmentInteraction(data);
    }

และอย่าลืมว่าต้อง implement method ใน Activity Class ด้วย
    public void onFragmentInteraction(Data data) {
        // Do something with Activity
    }


โค้ดมาซะเยอะ ยังไม่มีอะไรเกี่ยวกับ Otto เลยยย จากโค้ดด้านบนเราก็จะเปลี่ยนมาใช้ Otto กันบ้าง

Otto

setup library ที่ gradle กันก่อน
    compile 'com.squareup:otto:1.3.8'

การใช้งานใน Activity / Fragment Class
    @Override
    protected void onResume() {
        super.onResume();

        // Register ourselves so that we can provide the initial value.
        BusProvider.getInstance().register(this);
    }

    @Override
    protected void onPause() {
        super.onPause();

        // Always unregister when an object no longer should be on the bus.
        BusProvider.getInstance().unregister(this);
    }

การส่งค่า
    @Override
    public void onClick(View v) {
        BusProvider.getInstance().post(data);
    }

การรับค่า
    @Subscribe
    public void onObjectSubscribed(Data data) {

    }

    @Subscribe
    public void onStringSubscribed(String data) {

    }

Class ที่จะใช้งาน otto ได้ต้องทำการ register() ก่อน เมื่อมีการเรียก post() ก็จะมีการส่งค่าไปยัง method ทุกตัวที่ parameter type ตรงกัน เท่านี้เราก็จะได้ข้อมูลไปใช้งานต่อแล้วครับ ถ้าลองเอาไปใช้งานจริง จะพบว่า source code ของเราสะอาดตาขึ้นพอควร และยังเข้าใจได้ง่ายกว่าด้วยครับ

official site : http://square.github.io/otto/

Facebook Comment

Popular post of 7 days

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

ลืมรหัสปลดล็อค Android เข้าเครื่องไม่ได้ มีทางออกครับ

[Android] เปิดเครื่องไม่ได้ โลโก้ค้าง (Boot Loop)