package net.avenwu.support.presenter; import net.avenwu.support.protocol.RenderAction; import net.avenwu.support.protocol.UIAction; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import retrofit.Callback; import retrofit.RetrofitError; import retrofit.client.Response; /** * Created by chaobin on 7/12/15. */ public class Presenter { List<DetachableCallback<?>> mCallback; Map<String, RenderAction<?>> mActions; boolean mAttached = false; public void attach() { mAttached = true; } public <T> Callback<T> addCallback(DetachableCallback<T> callback) { if (mCallback == null) { mCallback = new ArrayList<DetachableCallback<?>>(); } mCallback.add(callback); return callback; } public Presenter addAction(String key, RenderAction<?> action) { if (mActions == null) { mActions = new HashMap<String, RenderAction<?>>(); } mActions.put(key, action); return this; } public void detach() { mAttached = false; if (mCallback != null) { for (DetachableCallback<?> callback : mCallback) { callback.detach(); } } if (mActions != null) { Iterator<Map.Entry<String, RenderAction<?>>> iterator = mActions.entrySet().iterator(); while (iterator.hasNext()) { // avoid memory leak if (iterator.next().getValue() instanceof UIAction) { iterator.remove(); } } } } public void invoke(String key, Object data) { if (mActions != null && mActions.size() > 0) { RenderAction action = mActions.get(key); if (action != null) { action.onUpdate(data); if (mAttached && action instanceof UIAction) { ((UIAction) action).onUpdateUI(data); } } } } protected static class DetachableCallback<T> implements Callback<T> { Callback<T> callback; public DetachableCallback(Callback<T> callback) { this.callback = callback; } @Override public void success(T t, Response response) { if (callback != null) { callback.success(t, response); } } @Override public void failure(RetrofitError error) { if (callback != null) { callback.failure(error); } } public void detach() { callback = null; } } }