UriMatcher使用原理的原始碼分析

2021-08-03 14:20:55 字數 4249 閱讀 2492

1 構造方法分析

首先構造乙個

urimatcher物件a

,構造方法如下:

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()

該urimatcher物件的

成員變數如下:

mcode = no_match;

mwhich = -1;

mchildren = new arraylist();

mtext = null;

此時的樹形結構圖如下:

其餘成員變數的初始化:

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;

2 adduri方法原始碼分析adduri是將期望匹配的內容uri個是傳遞進去,

在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,它的用法如下 首先第一步把你需要匹配...