1 構造方法分析
首先構造乙個
urimatcher物件a
,構造方法如下:
該urimatcher物件的public static final int no_match = -1;
/** * creates the root node of the uri tree.
* * @param code the code to match for the root uri
*/// 構造方法
public urimatcher(int code)
// 構造方法
private urimatcher()
成員變數如下:
此時的樹形結構圖如下:mcode = no_match;
mwhich = -1;
mchildren = new arraylist();
mtext = null;
其餘成員變數的初始化:
2 adduri方法原始碼分析adduri是將期望匹配的內容uri個是傳遞進去,private static final int exact = 0;
private static final int number = 1;
private static final int text = 2;
private int mcode;
private int mwhich;
private string mtext;
private arraylistmchildren;
在adduri方法中,先按照分隔符「/」分隔path,得到字串陣列,再根據這個字串陣列構造乙個uri的樹形結構的匹配,類似於計算機目錄的結構。
adduri的方法原型是public void adduri(string authority, string path, int code)
注意這裡傳入的路徑引數是可以使用萬用字元的。
1.「*」表示匹配任意長度的任意字元
2.「#」表示匹配任意長度的數字
執行adduri方法:
下面從原始碼步驟的角度來理解adduri的原理,原始碼如下:
public void adduri(string authority, string path, int code)
string tokens = null;
// 以「/」作為分隔符分隔path,得到字串陣列tokens
if (path != null)
tokens = newpath.split("/");
}int numtokens = tokens != null ? tokens.length : 0; // 字串陣列的元素個數
urimatcher node = this; // 第乙個node為其自身
// 斷點1
for (int i = -1; i < numtokens; i++)
}// 只有當children中沒有乙個urimatcher的mtext與token相同,才不會觸發break,j會一直增加到numchildren從而退出j
斷點1:tokens = ,numtokens = 2
在斷點2下面的for迴圈中,嘗試尋找物件a的mchildren集合中是否存在乙個urimatcher物件,使得它的mtext與token相等;
由於 numchildren=0 且 j=0 ,不滿足 j
接著,由於j等於numchildren,所以進入到 if(j==numchildren) 的條件判斷語句中,建立乙個新的urimatcher物件,記為b。
對token進行劃分,與「#」相等,則b的mwhich記為number,與「*」相等,則b的mwhich記為text,其他情況,則b的mwhich記為exact。
將物件b新增到物件a的mchildren集合中,並將物件b作為下一次迴圈的node。
到斷點4位置,結構圖如下:
第二個迴圈,i=0,到斷點2時,token = "table1",numchildren = 0;
此時會重複 i=-1 的那個迴圈的處理過程,重新建立乙個urimatcher物件c,進行成員變數賦值後加入到物件b的mchildren集合裡面,並將物件c作為下一次迴圈的node。
到斷點4位置,結構圖如下:
第三個迴圈,i=1,到斷點2時,token = "1",numchildren = 0;
重複上面的迴圈,重新建立乙個urimatcher物件d,進行成員變數賦值後加入到物件c的mchildren集合裡面,並將物件d作為下一次迴圈的node。
到斷點4位置,結構圖如下:
到斷點5位置,將adduri方法中的引數code賦值給物件d的成員變數mcode。至此,第乙個adduri已經分析完成。
下面開始第二個adduri方法的分析:
斷點1處:tokens = ,numtokens = 2,node為物件a。
可以理解成,乙個人在資料夾a下面已經有了乙個資料夾b了,這個時候,另乙個人也需要在資料夾a下建立資料夾b做其他用,但是發現,資料夾a裡面已經存在資料夾b了,那麼直接拿來用就可以了。
接下來進入到 i=0 的for迴圈。
到斷點2處,token = 「table1」,numchildren = 1。與 i=-1 的流程一致,token與物件c的mtext相同,則物件c作為新的node,並進入到 i=1 的迴圈中。
在 i=1 的for迴圈裡,到斷點2處,token = 「*」,numchildren = 1。
在進入到斷點2下面的for迴圈中時,遍歷物件c的mchildren集合中的物件,沒有乙個物件的mtext與token相同,所以需要重新建立乙個urimatcher物件新增到物件c的mchildren集合中。
此時,j=1,與numchildren相等,從而進入到 if (j == numchildren) 的判斷語句中,建立乙個urimatcher物件e,並給物件e進行相應的賦值。由於 j
到斷點5時,結構圖如下:
至此,adduri方法的原始碼分析已經結束。相信你已經理解了。可以理解成建立相應的目錄和子目錄。
3 match方法原始碼分析
該方法就是查詢樹形結構,看看是否有滿足url(許可權和路徑)的匹配物件。
// 根據url來匹配獲得adduri中的code
public int match(uri uri)
// 把許可權和pathsegments中的元素,一一進行匹配
for (int i=-1; ilist = node.mchildren;
if (list == null)
node = null;
int lj = list.size();
// 遍歷mchildren中的urimatcher物件,看看是否有滿足mwhich和mtext符合要求的
for (int j=0; j'9')
}node = n;
break;
case text:
node = n;
break;
}// 如果node不為null,說明找到了乙個node,並break掉當前的遍歷迴圈,但是還沒有跳出外面的for迴圈
if (node != null)
}// 如果說遍歷mchildren中的urimatcher物件,都沒有找到符合要求的urimatcher物件,說明匹配不成功,直接返回no_match
if (node == null)
}// 執行到此處,說明匹配成功了,返回該urimatcher物件的mcode
return node.mcode;
}
UriMatcher類使用介紹
因為uri代表了要操作的資料,所以我們很經常需要解析uri,並從uri中獲取資料。android系統提供了兩個用於操作uri的工具類,分別為urimatcher 和contenturis 掌握它們的使用,會便於我們的開發工作。urimatcher類用於匹配uri,它的用法如下 首先第一步把你需要匹配...
UriMatcher類使用介紹
因為uri 代表了要操作的資料,所以我們很經常需要解析 uri,並從uri 中獲取資料。android 系統提供了兩個用於操作 uri的工具類,分別為 urimatcher 和contenturis 掌握它們的使用,會便於我們的開發工作。urimatcher 類用於匹配u ri,它的用法如下 首先第...
UriMatcher類使用介紹
因為uri代表了要操作的資料,所以我們很經常需要解析uri,並從uri中獲取資料。android系統提供了兩個用於操作uri的工具類,分別為urimatcher 和contenturis 掌握它們的使用,會便於我們的開發工作。urimatcher類用於匹配uri,它的用法如下 首先第一步把你需要匹配...