0

嗨,我的活动必须使用套接字接收一个对象..

此活动在片段 A 和片段 B 内。

我希望每次活动接收对象时,将其发送到片段 A。

我能怎么做?

4

1 回答 1

1

我认为这是一个完美的例子,说明事件总线非常方便。查看Square 的 Otto。如果您创建事件总线并使其可用于您的活动和片段(通过静态类或使用依赖注入),您可以通过总线发送 myObject 而无需序列化它。

这是一些示例代码。首先,我在 OttoBus.java 中创建一个可静态访问的全局事件总线。这是我们将在活动和片段之间来回传递消息的总线。在活动中,我假设您将拥有某种从套接字接收数据的方法。接收到的数据将被放入一个 SocketDataReceivedEvent 对象并在总线上发送。在您的片段中,您在片段启动时在总线上注册片段,并在片段停止时取消注册(以避免泄漏)。Fragment 还必须具有处理 SocketDataReceivedEvent 的方法。这个方法可以任意命名,只要它带有 @Subscribe 注释并接受一个 SocketDataReceivedEvent 作为它的唯一参数。

---- OttoBus.java
import com.squareup.otto.Bus;

public class OttoBus {

    private static Bus bus = new Bus();

    public static void register(Object o) {
        bus.register(o);
    }

    public static void post(Object data) {
        bus.post(data);
    }

    public static void unregister(Object o) {
        bus.unregister(o);
    }
}


---- SocketDataReceivedEvent.java
public class SocketDataReceivedEvent {

    public Object data;

    public SocketDataReceivedEvent(Object data) {
        this.data = data;
    }
}


---- YourActivty.java
public class YourActivity extends Activity {

    public void receiveSomethingOnSocket(Object theDataYouReceived) {
        OttoBus.send(new SocketDataReceivedEvent(theDataYouReceived));
    }
}


---- YourFragment.java
public class YourFragment extends Fragment {

    @Override
    public void onStart() {
        super.onStart();
        OttoBus.register(this);
    }

    @Override
    public void onStop() {
        super.onStop();
        OttoBus.unregister(this);
    }

    @Subscribe
    public void onSocketData(final SocketDataReceivedEvent e) {
        // do something with e.data
    }
}
于 2013-04-25T19:17:05.577 回答