package net.micode.notes.gtask.remote; public class GTaskManager { private static final String TAG = GTaskManager.class.getSimpleName(); public static final int STATE_SUCCESS = 0; public static final int STATE_NETWORK_ERROR = 1; public static final int STATE_INTERNAL_ERROR = 2; public static final int STATE_SYNC_IN_PROGRESS = 3; public static final int STATE_SYNC_CANCELLED = 4; private static GTaskManager mInstance = null; private Activity mActivity; private Context mContext; private ContentResolver mContentResolver; private boolean mSyncing; private boolean mCancelled; private HashMap mGTaskListHashMap; private HashMap mGTaskHashMap; private HashMap mMetaHashMap; private TaskList mMetaList; private HashSet mLocalDeleteIdMap; private HashMap mGidToNid; private HashMap mNidToGid; private GTaskManager() { //对象初始化函数 mSyncing = false; //正在同步,flase代表未执行 mCancelled = false; //全局标识,flase代表可以执行 mGTaskListHashMap = new HashMap(); //<>代表Java的泛型,就是创建一个用类型作为参数的类。 mGTaskHashMap = new HashMap(); mMetaHashMap = new HashMap(); mMetaList = null; mLocalDeleteIdMap = new HashSet(); mGidToNid = new HashMap(); //GoogleID to NodeID?? mNidToGid = new HashMap(); //NodeID to GoogleID???通过hashmap散列表建立映射 } /** * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 * 功能:类初始化函数 * @author TTS * @return GtaskManger */ public static synchronized GTaskManager getInstance() { //可能运行在多线程环境下,使用语言级同步--synchronized if (mInstance == null) { mInstance = new GTaskManager(); } return mInstance; } /** * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 * @author TTS * @param activity */ public synchronized void setActivityContext(Activity activity) { // used for getting auth token mActivity = activity; } /** * 核心函数 * 功能:实现了本地同步操作和远端同步操作 * @author TTS * @param context-----获取上下文 * @param asyncTask-------用于同步的异步操作类 * @return int */ public int sync(Context context, GTaskASyncTask asyncTask) { //核心函数 if (mSyncing) { Log.d(TAG, "Sync is in progress"); //创建日志文件(调试信息),debug return STATE_SYNC_IN_PROGRESS; } mContext = context; mContentResolver = mContext.getContentResolver(); mSyncing = true; mCancelled = false; mGTaskListHashMap.clear(); mGTaskHashMap.clear(); mMetaHashMap.clear(); mLocalDeleteIdMap.clear(); mGidToNid.clear(); mNidToGid.clear(); try { GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client--客户机 client.resetUpdateArray(); //JSONArray类型,reset即置为NULL // login google task if (!mCancelled) { if (!client.login(mActivity)) { throw new NetworkFailureException("login google task failed"); } } // get the task list from google asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list)); initGTaskList(); //获取Google上的JSONtasklist转为本地TaskList // do content sync work asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing)); syncContent(); } catch (NetworkFailureException e) { //分为两种异常,此类异常为网络异常 Log.e(TAG, e.toString()); //创建日志文件(调试信息),error return STATE_NETWORK_ERROR; } catch (ActionFailureException e) { //此类异常为操作异常 Log.e(TAG, e.toString()); return STATE_INTERNAL_ERROR; } catch (Exception e) { Log.e(TAG, e.toString()); e.printStackTrace(); return STATE_INTERNAL_ERROR; } finally { mGTaskListHashMap.clear(); mGTaskHashMap.clear(); mMetaHashMap.clear(); mLocalDeleteIdMap.clear(); mGidToNid.clear(); mNidToGid.clear(); mSyncing = false; } return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS; } /** *功能:初始化GtaskList,获取Google上的JSONtasklist转为本地TaskList。 *获得的数据存储在mMetaList,mGTaskListHashMap,mGTaskHashMap *@author TTS *@exception NetworkFailureException *@return void */ private void initGTaskList() throws NetworkFailureException { if (mCancelled) return; GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client应指远端客户机 try { //Json对象是Name Value对(即子元素)的无序集合,相当于一个Map对象。JsonObject类是bantouyan-json库对Json对象的抽象,提供操纵Json对象的各种方法。 //其格式为{"key1":value1,"key2",value2....};key 必须是字符串。 //因为ajax请求不刷新页面,但配合js可以实现局部刷新,因此json常常被用来作为异步请求的返回对象使用。 JSONArray jsTaskLists = client.getTaskLists(); //原注释为get task list // init meta list first初始化 mMetaList = null; //TaskList类型 for (int i = 0; i < jsTaskLists.length(); i++) { JSONObject object = jsTaskLists.getJSONObject(i); //JSONObject与JSONArray一个为对象,一个为数组。此处取出单个JASONObject String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); if (name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) { mMetaList = new TaskList(); //MetaList意为元表,Tasklist类型,此处为初始化 mMetaList.setContentByRemoteJSON(object); //将JSON中部分数据复制到自己定义的对象中相对应的数据:name->mname... // load meta data JSONArray jsMetas = client.getTaskList(gid); //原注释为get action_list for (int j = 0; j < jsMetas.length(); j++) { object = (JSONObject) jsMetas.getJSONObject(j); MetaData metaData = new MetaData(); //继承自Node metaData.setContentByRemoteJSON(object); if (metaData.isWorthSaving()) { //if not worth to save,metadata将不加入mMetaList 判断是否存入 mMetaList.addChildTask(metaData); if (metaData.getGid() != null) { mMetaHashMap.put(metaData.getRelatedGid(), metaData); } } } } } // create meta list if not existed if (mMetaList == null) { mMetaList = new TaskList(); mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META); GTaskClient.getInstance().createTaskList(mMetaList); } // init task list初始化 for (int i = 0; i < jsTaskLists.length(); i++) { JSONObject object = jsTaskLists.getJSONObject(i); String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); //通过getString函数传入本地某个标志数据的名称,获取其在远端的名称。 String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX) && !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) { TaskList tasklist = new TaskList(); //继承自Node tasklist.setContentByRemoteJSON(object); mGTaskListHashMap.put(gid, tasklist); mGTaskHashMap.put(gid, tasklist); // load tasks加载 JSONArray jsTasks = client.getTaskList(gid); for (int j = 0; j < jsTasks.length(); j++) { object = (JSONObject) jsTasks.getJSONObject(j); gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); Task task = new Task(); task.setContentByRemoteJSON(object); if (task.isWorthSaving()) { task.setMetaInfo(mMetaHashMap.get(gid)); tasklist.addChildTask(task); mGTaskHashMap.put(gid, task); } } } } } catch (JSONException e) { Log.e(TAG, e.toString()); e.printStackTrace(); throw new ActionFailureException("initGTaskList: handing JSONObject failed"); }