[Android] Otto ตัวช่วยส่งข้อมูลผ่าน event bus
อย่างที่รู้กันในหมู่ Android Developer ว่า การคุยกันระหว่าง Activity กับ Fragment นั้นไม่ง่ายเลย แต่บทความนี้ผมจะยังไม่อธิบายว่าแตกต่างกันอย่างไร (ถ้าใครใจร้อนมี link ให้ครับ http://developer.android.com/guide/components/fragments.html)
เตรียมพร้อมด้วย communication interface ก่อน
การใช้งานใน Fragment Class
ทำการส่งค่าจาก Fragment ไปยัง Activity
และอย่าลืมว่าต้อง implement method ใน Activity Class ด้วย
โค้ดมาซะเยอะ ยังไม่มีอะไรเกี่ยวกับ Otto เลยยย จากโค้ดด้านบนเราก็จะเปลี่ยนมาใช้ Otto กันบ้าง
setup library ที่ gradle กันก่อน
การใช้งานใน Activity / Fragment Class
การส่งค่า
การรับค่า
Class ที่จะใช้งาน otto ได้ต้องทำการ register() ก่อน เมื่อมีการเรียก post() ก็จะมีการส่งค่าไปยัง method ทุกตัวที่ parameter type ตรงกัน เท่านี้เราก็จะได้ข้อมูลไปใช้งานต่อแล้วครับ ถ้าลองเอาไปใช้งานจริง จะพบว่า source code ของเราสะอาดตาขึ้นพอควร และยังเข้าใจได้ง่ายกว่าด้วยครับ
official site : http://square.github.io/otto/
วิธีพื้นบ้าน (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/