package com.gnod.geekr.tool.fetcher; import java.io.IOException; import java.util.ArrayList; import org.json.JSONException; import org.json.JSONObject; import android.os.Handler; import android.os.Message; import android.util.Log; import com.gnod.geekr.app.AppConfig; import com.gnod.geekr.model.AccountModel; import com.gnod.geekr.tool.WeiboBaseTool; import com.gnod.geekr.tool.StringUtils; import com.gnod.geekr.tool.manager.AccountManager; import com.weibo.sdk.android.Oauth2AccessToken; import com.weibo.sdk.android.WeiboException; import com.weibo.sdk.android.net.RequestListener; public abstract class BaseFetcher { public static final int FETCH_FAILED = 0; public static final int FETCH_SUCCEED_NEWS = 1; public static final int FETCH_SUCCEED_MORE = 2; public static final int FETCH_EMPTY = 3; public static final int FETCH_NOT_NETWORK = 4; public static final int FETCH_AUTH_FAILED = 5; public interface FetchCompleteListener { public void fetchComplete(int state, int errorCode, Object obj); } public AppConfig getConfig() { return AppConfig.getInstance(); } protected abstract class FetchHandler<T> implements Runnable{ private FetchCompleteListener mCompleteListener; private ArrayList<T> resultList; private AccountModel account; public FetchHandler(FetchCompleteListener listener) { this.mCompleteListener = listener; } public FetchHandler(AccountModel account, FetchCompleteListener listener){ this(listener); this.account = account; } public void fetch() { Thread thread = new Thread(this); thread.start(); } @Override public void run() { if(!getConfig().isNetworkConnected()) { Message msg = new Message(); msg.arg1 = FETCH_NOT_NETWORK; msg.obj = "网络连接错误"; mFriendsTimeLineHandler.sendMessage(msg); return; } WeiboBaseTool tool = WeiboBaseTool.getInstance(); Oauth2AccessToken oa; if(account == null){ account = AccountManager.getActivityAccount(); } oa = tool.getOauth2AccessToken(account); if (oa == null) { Message msg = new Message(); msg.arg1 = FETCH_AUTH_FAILED; msg.obj = "验证失败或已过期"; mFriendsTimeLineHandler.sendMessage(msg); return; } resultList = new ArrayList<T>(); resultList.clear(); callAPI(oa, mFetchListener); } public abstract void callAPI(Oauth2AccessToken oa, RequestListener listener); public abstract void convertData(String arg0, ArrayList<T> list, Message msg) throws JSONException; protected void fetchComplete(String arg0) { Message msg = new Message(); msg.arg1 = FETCH_FAILED; if(StringUtils.isNullOrEmpty(arg0)) { msg.obj = "获取数据失败"; } else { JSONObject object; try { object = new JSONObject(arg0); msg.arg2 = object.optInt("error_code"); msg.obj = object.optString("error"); } catch (JSONException e) { e.printStackTrace(); } } mFriendsTimeLineHandler.sendMessage(msg); } private RequestListener mFetchListener = new RequestListener() { @Override public void onIOException(IOException arg0) { Log.e("fetch", arg0.getMessage()); fetchComplete(""); } @Override public void onError(WeiboException arg0) { Log.e("fetch", arg0.getMessage() + " statusCode:" + arg0.getStatusCode()); fetchComplete(arg0.getMessage()); } @Override public void onComplete(String arg0) { Message msg = new Message(); msg.arg2 = -1; try { convertData(arg0, resultList, msg); } catch (Exception e) { Log.e("error", e.getMessage()); msg.arg1 = FETCH_FAILED; msg.obj = "获取数据失败"; }finally{ mFriendsTimeLineHandler.sendMessage(msg); } } }; private Handler mFriendsTimeLineHandler = new Handler(){ @Override public void handleMessage(Message msg) { if(mCompleteListener != null) { if(msg.arg1 != BaseFetcher.FETCH_NOT_NETWORK && account != AccountManager.getActivityAccount()){ msg.arg1 = FETCH_FAILED; } mCompleteListener.fetchComplete(msg.arg1, msg.arg2, msg.obj); } } }; } }