content: package com.example.datadroiddemo.base;
  
  import java.util.ArrayList;
  
  import android.os.Bundle;
  import android.support.v4.app.FragmentActivity;
  import android.view.View;
  import android.widget.TextView;
  
  import com.example.datadroiddemo.request.RequestManagerImpl;
  import com.example.datadroiddemo.utils.Utility;
  import com.foxykeep.datadroid.requestmanager.Request;
  
  /**
   * 
   * The goal of this base class: 1. bind the Datadroid to use 2. bind the
   * lifecycle of activity to Datadroid callback 3. process the loading and error
   * state
   * 
   */
  
  public abstract class RequestActivity extends FragmentActivity implements
  		RequestBaseUi {
  	protected static final String SAVED_STATE_REQUEST_LIST = "savedStateRequestList";
  	protected RequestManagerImpl mRequestManager = null;
  	protected ArrayList<Request> mRequestList = null;
  	protected boolean mContextDestroyed = false;
  
  	@Override
  	public void onCreate(Bundle savedInstanceState) {
  		super.onCreate(savedInstanceState);
  
  		setContentView(getContentViewId());
  		initAllMembers(savedInstanceState);
  		if (Utility.isNetworkAvailable(this)) {
  			launchRequest(getInitialRequest());
  			if (needShowLoadingIndicator()) {
  				onLoadingIndicatorShow();
  			}
  		} else {
  			handleException(EXCEPTION_TYPE_NETWORK);
  		}
  	}
  
  	@Override
  	public void onDestroy() {
  		mContextDestroyed = true;
  		super.onDestroy();
  	}
  
  	@Override
  	public void onSaveInstanceState(Bundle outState) {
  		super.onSaveInstanceState(outState);
  		outState.putParcelableArrayList(SAVED_STATE_REQUEST_LIST, mRequestList);
  	}
  
  	@Override
  	public void initAllMembers(Bundle savedInstanceState) {
  		mContextDestroyed = false;
  		mRequestManager = RequestManagerImpl.from(this);
  
  		if (savedInstanceState != null) {
  			mRequestList = savedInstanceState
  					.getParcelableArrayList(SAVED_STATE_REQUEST_LIST);
  		}
  		if (mRequestList == null) {
  			mRequestList = new ArrayList<Request>();
  		}
  	}
  
  	@Override
  	public void initLoader() {
  
  	}
  
  	public Request getInitialRequest() {
  		return null;
  	}
  
  	@Override
  	public final void launchRequest(Request request) {
  		if (request != null) {
  			if (Utility.isNetworkAvailable(this)) {
  				mRequestManager.execute(request, this);
  				mRequestList.add(request);
  
  				View errorIndicatorLayout = getErrorIndicatorLayout();
  				if (errorIndicatorLayout != null
  						&& errorIndicatorLayout.getVisibility() == View.VISIBLE) {
  					errorIndicatorLayout.setVisibility(View.INVISIBLE);
  				}
  			} else {
  				handleException(EXCEPTION_TYPE_NETWORK);
  			}
  		}
  	}
  
  	@Override
  	public final void onRequestConnectionError(Request arg0, int arg1) {
  		if (mRequestList.contains(arg0)) {
  			mRequestList.remove(arg0);
  		}
  
  		if (arg1 == -1) {
  			handleException(EXCEPTION_TYPE_NETWORK);
  		} else {
  			handleException(EXCEPTION_TYPE_SERVER_RESPONSE_ERROR);
  		}
  	}
  
  	@Override
  	public final void onRequestCustomError(Request arg0, Bundle arg1) {
  		if (mRequestList.contains(arg0)) {
  			mRequestList.remove(arg0);
  		}
  
  		handleException(EXCEPTION_TYPE_CUSTOM_BASE);
  	}
  
  	@Override
  	public final void onRequestDataError(Request arg0) {
  		if (mRequestList.contains(arg0)) {
  			mRequestList.remove(arg0);
  		}
  
  		handleException(EXCEPTION_TYPE_DATA);
  	}
  
  	@Override
  	public final void onRequestFinished(Request arg0, Bundle arg1) {
  		if (mContextDestroyed) {
  			return;
  		}
  
  		if (mRequestList.contains(arg0)) {
  			onLoadingIndicatorHide();
  			initLoader();
  			onRequestSucess(arg0, arg1);
  			mRequestList.remove(arg0);
  		}
  	}
  
  	@Override
  	public final void handleException(int exceptionType) {
  		if (mContextDestroyed) {
  			return;
  		}
  		onLoadingIndicatorHide();
  		onRequestError(exceptionType);
  	}
  
  	@Override
  	public void onRequestSucess(Request request, Bundle bundle) {
  
  	}
  
  	@Override
  	public void onRequestError(int exceptionType) {
  		View errorIndicatorLayout = getErrorIndicatorLayout();
  		TextView errorMsgTextView = getErrorMsgTextView();
  		if (errorIndicatorLayout == null || errorMsgTextView == null) {
  			return;
  		}
  
  		switch (exceptionType) {
  		case EXCEPTION_TYPE_NETWORK:
  			errorMsgTextView.setText("网络错误！");
  			errorIndicatorLayout.setVisibility(View.VISIBLE);
  			break;
  		case EXCEPTION_TYPE_DATA:
  			errorMsgTextView.setText("数据错误！");
  			errorIndicatorLayout.setVisibility(View.VISIBLE);
  			break;
  		case EXCEPTION_TYPE_SERVER_RESPONSE_ERROR:
  			errorMsgTextView.setText("服务器出错！");
  			errorIndicatorLayout.setVisibility(View.VISIBLE);
  			break;
  		case EXCEPTION_TYPE_EMPTY_RESULT:
  			errorMsgTextView.setText("暂无相关数据");
  			errorIndicatorLayout.setVisibility(View.VISIBLE);
  			break;
  		default:
  			break;
  		}
  	}
  
  	@Override
  	public View getErrorIndicatorLayout() {
  		return null;
  	}
  
  	@Override
  	public TextView getErrorMsgTextView() {
  		return null;
  	}
  
  	@Override
  	public View getLoadingIndicatorView() {
  		return null;
  	}
  
  	@Override
  	public boolean needShowLoadingIndicator() {
  		return true;
  	}
  
  	@Override
  	public final void onLoadingIndicatorShow() {
  		View view = getLoadingIndicatorView();
  		if (view != null) {
  			view.setVisibility(View.VISIBLE);
  		}
  	}
  
  	@Override
  	public final void onLoadingIndicatorHide() {
  		View view = getLoadingIndicatorView();
  		if (view != null) {
  			view.setVisibility(View.GONE);
  		}
  	}
  }
  