content: package com.promeg.learn.otto.demo.net;
  
  import com.promeg.learn.otto.demo.base.GraphRetriever;
  import com.squareup.otto.Bus;
  import com.squareup.otto.Produce;
  import com.squareup.otto.Subscribe;
  
  import android.content.Context;
  
  import javax.inject.Inject;
  
  import model.Ticker;
  import model.event.GetInfoDoneEvent;
  import model.event.GetInfoEvent;
  import retrofit.Callback;
  import retrofit.RetrofitError;
  import retrofit.client.Response;
  
  /**
   * Created by PromeG on 2014/7/8.
   */
  public class BitCoinService {
      protected Context                      mContext;
  
      @Inject
      protected Bus                          mBus;
  
      @Inject
      protected BitCoinInterface             mBitCoinInterface;
  
      Ticker                                 mLastTicker = null;
  
      private volatile static BitCoinService singleton;
  
      // 单例模式
      public static BitCoinService getInstance(Context context) {
          if (singleton == null) {
              synchronized (BitCoinService.class) {
                  if (singleton == null) {
                      singleton = new BitCoinService(context);
                  }
              }
          }
          return singleton;
      }
  
      private BitCoinService(Context context) {
          mContext = context;
          GraphRetriever.from(context).inject(this);
          mBus.register(this);
      }
  
      @Subscribe
      public void onRequsetGetInfo(GetInfoEvent event) {
  
          mBitCoinInterface.contributors(new Callback<Ticker>() {
              @Override
              public void success(Ticker ticker, Response response) {
                  mLastTicker = ticker;
                  // success
                  mBus.post(new GetInfoDoneEvent(true, null, ticker));
              }
  
              @Override
              public void failure(RetrofitError retrofitError) {
                  mBus.post(new GetInfoDoneEvent(false, retrofitError, null));
              }
          });
      }
  
      @Produce
      public GetInfoDoneEvent produceAnswer() {
          if (mLastTicker != null)
              return new GetInfoDoneEvent(true, null, mLastTicker);
          else
              return new GetInfoDoneEvent(false, null, null);
      }
  
  }
  