Xutils源碼檔案下載方法的調用流程,xutils源碼
//我主要是好奇Xutils是在哪裡回調onLoading(),找老半天沒找到,好不容易找到就寫下來吧
前言:
1.僅對主要程式碼進行摘要,提供大致流程
2.為便於理解,本文變數名不同於源碼變數名,而是類名的駝峰式寫法。如源碼中:WorkRunnable mWorker,在本文中為 workRunnable
3.需要配合看Xutils的源碼,可以讓你看Xutils原始碼時減少一定的難度
代碼主幹:
HttpFragment:
//HttpFragment是Xutils內建例子中的一個類
httpUtils = new HttpUtils();
httpUtils.send(mthord, url, params, callback{ onStart(), onLoading(), onSuccess(), onFailure, })
HttpUtils:
httpRequest = new HttpRequest(method, url);httpUtils.sendRequest(request, params, callback);httpHandler = new Handler<T>(httpClient, httpContext, resoponseTextCharset, callBack);httpRequest.setRequestParams(params, httpHandler);httpHandler.executeOnExcutor(priorityExecutor, request);
PriorityAsynTask == HttpHandler:
//HttpHandler extends PriorityAsyncTask,故以下方法實際上調用的是HttpHandler中的方法
//Thread可以執行的有兩類介面 1.Runable()介面 2.Callable介面//區別是分別調用run()、call()開線程;後者有返回值,可取消作業,可以返回異常//然而想要用Thread調用Callable需要用FutreTask封裝,FutureTask實現了Runable介面,done()方法在作業結束後執行,可用來判斷下載成功、取消等狀態;
//下面兩行代碼是初始化,不在執行順序中workRunnable{ call(){ return postResult(doInBackground(parmas)}};futureTask = new FutureTask<Result>(workRunnable){ done( postResultIfNotInvoke())};
workRunnable.mParams = params;priorityExecutor.execute(new PriorityRunnable(priority, futureTask));
PriorityExecutor://用線程池來開線程threadPoolExecutor.execute(new PriorityRunnable(priority, futrueTask))
PriorityRunnable:
//futureTask是workRunnable封裝類,調用的是workRunnable裡的方法,即postResult(doInBackground(parmas);
futrueTask.run();
HttpHandler://終於運行HttpHandler的doInBackground了httpHandler.doInBackground();httpHandler.sendRequest(httpRequest);httpResponse = client.execute(httpRequest, context);handleResponse(httpResponse);fileDownloadHandler.handleEntity(httpEntity, httpHandler, charset);
StringDownloadHandler://終於到下載處理階段了。O(∩_∩)O哈哈~ while ((line = reader.readLine()) != null) { httpHandler.updateProgress(total, current, false) }
HttpHandler:httpHandler.publishProgress(UPDATE_LOADING, total, current);
//values = new Progress[]{UPDATE_LOADING, total, current}; 利用Java的不確定數量的形參機制,即(Profress... )//利用Handler機制通訊 handler.obtainMessage(MESSAGE_POST_PROGRESS, new AsyncTaskResult<Progress>(this, values))
//priorityAsyncTask就是httpHandlerasyncTaskResult.priorityAsyncTask.onProgressUpdate(values);//根據values[0]判斷為正在下載requestCallBack.onLoading( Long.valueOf(String.valueOf(values[1])),//檔案總大小 Long.valueOf(String.valueOf(values[2])),//已下載大小 isUploading);//好了到這裡就結束了,其他的開始下載、下載完、下載失敗的回呼函數的邏輯於此類似。
Eclipse怎導航到調用的一個方法的源碼
推薦使用快速鍵F3
怎讀取某個exe檔案的原始碼?
產生的程式是不能看到原始碼的,不過可以看到那個程式的資源,用E-Code Explorer 反組譯碼調試由易語言編譯產生的易格式可執行檔,分析內部結構,查看其中的各項資料。
【功能簡介】
1。格式分析:分析易格式可執行檔的總體結構,查看對應項的資料。分別對PE骨骼(PE頭)和易格式原體分析,以樹形結構清晰的顯示,同時輔以詳細的分析表格。
2。反組譯碼分析:快速的靜態反組譯碼易格式可執行檔。提供方便的跳轉、調用目標地址的代碼預覽功能。
3。表單分析:對易格式可執行檔中包含的表單資料分析。以樹型結構清晰的顯示表單單元的從屬結構。詳細的控制項屬性顯示、準確的事件處理函數定位、與反組譯碼模式便捷的切換,讓使用者可以立即進入要調試的事件函數領空,避免在runtime的空間裡四處打轉浪費時間。這一點對於調試非線性事件驅動類型的程式是必須的。
4。符號修飾:可以調用易語言支援庫作為符號表,對反組譯碼後的代碼進行修飾,可以直接分析出函數所調用的方法,操作的屬性,使用到的常量、基礎資料型別 (Elementary Data Type)、自訂資料類型和視窗單元。極大地提高了代碼的可讀性。
5。內部資料分析:能夠分析出程式使用到的常量、API函數、服務,調用的支援庫。
6。多種載入方式:支援從檔案載入和從某一進程的記憶體中直接載入反組譯碼。直接從進程列表附加,可以避免一部分AntiDebug造成的調試困難。
7。支援多種格式:支援標準PE可執行檔,易格式原體檔案,其他類型的易格式檔案。均可正確分析。
8。易格式捕捉者:對於不明外殼的易格式可執行檔(如:加殼後的,通過其它手段封裝的),能夠方便快速的進行分析。
9。提供十六進位檔案查看功能。
10。提供多種協助工具輔助,完成從記憶體dump易格式原體、修複重定位資訊、易格式原體產生EXE檔案等功能。
11。分析結果和反組譯碼結果均可直接匯出產生報告檔案。
12。支援自訂反組譯碼,HEX查看的環境顏色,你可以選擇自己喜歡的顏色來閱讀代碼。
13。詳細的分析設定,可以自己設定最合適的調試環境。
14。提供檔案拖放功能,直接進行分析或調試。
15。支援從命令列擷取要分析的檔案。
其他更多的功能等待您在使用中發現…………