黑馬程序員:三大框架Struts2-day01筆記
第1章 框架概述
什么是框架,為什么使用框架,框架優(yōu)點
框架(framework)是一個基本概念上的結構,用于去解決或者處理復雜的問題
框架,即framework。其實就是某種應用的半成品,就是一組組件,供你選用完成你自己的系統(tǒng)。簡單說就是使用別人搭好的舞臺,你來做表演。框架是在特定的領域內解決問題。優(yōu)點
重用代碼大大增加,軟件生產效率和質量也得到了提高
使用框架開發(fā),它提供統(tǒng)一的標準,大大降低了我們的后期維護。學習框架重點:了解框架做了什么,我們要在這個基礎上在做什么事情。
第2章 java開發(fā)中常用框架
SSH
(SSM SSI)SSH struts2 spring hibernate SSM(SSI)springmvc spring mybatis(ibatis)
SSH 它是企業(yè)開發(fā)中比較主流的一套架構。SSH框架在開發(fā)中所處的位置:
黑馬程序員鄭州中心 編著
第3章 Struts2框架介紹
什么是struts2框架,學習struts2框架的核心。
Struts2是一個基于MVC設計模式的Web應用框架,它本質上相當于一個servlet,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與視圖的數(shù)據(jù)交互
Struts2=struts1+webwork
問題:struts2是一個mvc框架,它的mvc是什么?
javaweb開發(fā)中的mvc,是在jsp的model2模式中提過 Model------javabean View--------jsp Controller----servlet
黑馬程序員鄭州中心 編著
核心點: 1.攔截器 interceptor 2.Action 3.ognl與valueStack
在現(xiàn)在開發(fā)中與struts2比較類似的框架有哪些? Struts1 webwork springmvc jsf
Struts2框架流程
黑馬程序員鄭州中心 編著
第4章 今天內容介紹與重點
今天內容:
一個簡單的登錄案例
在這個案例中,我們要使用struts2框架怎樣解決
重點: 1.struts2框架如何完成原來由servlet完成的工作。2.Struts2框架如何完成請求參數(shù)的封裝處理 3.Struts2框架如何完成頁面跳轉。
黑馬程序員鄭州中心 編著
第5章 簡單登錄案例原型
需要三個jsp頁面
login.jsp
success.jsp failer.jsp 還需要一個servlet
LoginServlet 主要完成的是業(yè)務邏輯操作。
login.jsp
LoginServlet
黑馬程序員鄭州中心 編著
第6章 Struts2框架來完成登錄操作
6.1 問題:為什么使用struts2框架?
Struts2框架它是一個在web中應用的mvc框架。我們使用strtus2框架來完成web開發(fā)有什么優(yōu)勢?
6.2 問題:怎樣使用strtuts2框架
首先要上網(wǎng)下載它的jar包。步驟: 1.導入相關的jar文件
2.需要在web.xml文件中配置一個Filter(只有配置了它才可以使用struts2框架)
黑馬程序員鄭州中心 編著
3.struts.xml配置
4.創(chuàng)建Action來完成邏輯操作
6.3 快速入門
我們使用的是struts2 2.3.24版本
我們使用strtus2框架不是直接將它的lib包下的所有的jar文件copy到項目中,而是使用其中的一部分。
我們可以參考它的示例代碼:
1.導入13個jar包
2.需要在web.xml文件中配置StrutsPrepareAndExecuteFilter 3.創(chuàng)建一個struts.xml文件,它的位置是可以放置在src下。
黑馬程序員鄭州中心 編著
6.3.1 代碼實現(xiàn) 6.3.1.1 jsp頁面
6.3.1.2 Action
6.3.1.3 struts.xml文件配置
6.3.2 流程分析
黑馬程序員鄭州中心 編著
6.4 使用struts2完成簡單登錄操作
1.login.jsp頁面不變動
2.創(chuàng)建一個LoginAction來完成邏輯操作 3.在struts.xml文件中完成配置操作
問題1:在LoginAction中如何得到username與password 可以直接在Action類中提供成員屬性,并為其提供get/set方法。就可以得到請求參數(shù)
問題2:如果實現(xiàn)路徑跳轉?
1.我們可以給action中的方法添加一個String返回值
2.在struts.xml配置文件中,在其對應的action配置上通過來確定跳轉的路徑。
黑馬程序員鄭州中心 編著
第7章 Struts2框架執(zhí)行流程
7.1 Struts2源碼導入
對于struts2框架它的源代碼我們主要使用三部分 1.struts2核心部分源代碼
org.apache.struts2xx
srccoresrcmainjava
2.struts2的xwork核心部分源代碼
srcxwork-coresrcmainjavacomopensymphonyxwork2 3.struts2的插件的源代碼
srcplugins 7.2 關于struts.xml配置文件中提示問題
第一步
在eclipse的window下首選面中查找xml catalog 第二步
Location:配置本地的dtd文件路徑 key type:選擇URI
黑馬程序員鄭州中心 編著
Key: http://struts.apache.org/dtds/struts-2.3.dtd
注意版本要對應,如果你可以上網(wǎng),那么會自動緩存dtd,具有提示功能。
7.3 執(zhí)行流程介紹
1.當通過瀏覽器發(fā)送一個請求
2.會被StrutsPrepareAndExecuteFilter攔截
3.會調用strtus2框架默認的攔截器(interceptor)完成部分功能 4.在執(zhí)行Action中操作
5.根據(jù)Action中方法的執(zhí)行結果來選擇來跳轉頁面Resutl視圖
一般管StrutsPrepareAndExecuteFilter 叫做前端控制器(核心控制器),只有配置了這個filter我們的strtus2框架才能使用。
黑馬程序員鄭州中心 編著
Strtus2的默認攔截器(interceptor)它們是在struts-default.xml文件中配置 注意:這上xml文件是在strtus-core.jar包中。默認的攔截器是在defaultStack中定義的。
第8章 Struts2配置詳解
8.1 Struts2配置文件加載順序
第一個加載的是default.properties文件
位置:strtus2-core.jar包
org.apache.struts2包下 作用:主要是聲明了struts2框架的常量
第二個加載的是一批配置文件
Strtus-default.xml 位置:struts2-corl.jar
作用:聲明了interceptor result bean Strtus-plugin.xml 位置:在strtus2的插件包中 作用:主要用于插件的配置聲明 Strtus.xml
黑馬程序員鄭州中心 編著
位置:在我們自己的工程中
作用:用于我們自己工程使用strtus2框架的配置 第三個加載的是自定義的strtus.properties 位置:都是在自己工程的src下 作用:定制常量 第四自定義配置提供
第五加載的是web.xml配置文件
主要是加載strtus2框架在web.xml文件中的相關配置.第六 bean相關配置
重點掌握: 1.Default.properties 2.Struts-default.xml 3.Struts-plugin.xml 4.Strtus.xml 5.web.xml
8.2 struts.xml文件配置介紹
8.2.1 package配置
1.name屬性
作用:定義一個包的名稱,它必須唯一。
黑馬程序員鄭州中心 編著
2.namespace屬性 作用:主要是與action標簽的name屬性聯(lián)合使用來確定一個action 的訪問路徑
3.extends屬性 作用:指定繼承自哪個包。一般值是strtus-default strtus-default包是在strtus-default.xml文件中聲明的。
4.abstruct屬性 它代表當前包是一個抽象的,主要是用于被繼承
8.2.2 action配置
1.name屬性 作用:主要是與package的namespace聯(lián)合使用來確定一個action的訪問路 徑
2.class屬性
作用:用于指示當前的action類
3.method屬性
作用:用于指示當前的action類中的哪個方法執(zhí)行
8.2.3 result配置
它主要是用于指示結果視圖
1.name屬性 作用是與action類的method方法的返回值進行匹配,來確定跳轉路徑 2.type屬性 作用是用于指定跳轉方式
8.2.4 擴展
關于action配置中的class與method的默認值以及result中的name與type 默認值問題
原因:strtus-default.xml文件中配置
黑馬程序員鄭州中心 編著
它的作用就是當一個請求來時,如果查找不到指定的class及對應的method就會執(zhí)行 ActionSupport類中的execute方法。
在這個類的execute方法中默認返回的是”success”
也就是說,result的name屬性默認值是success,默認的跳轉方式是請求轉發(fā) dispatcher
8.3 常量配置
default.properties文件中定義了struts2框架常用常量.問題:我們怎樣可以定義常量
1.可以在src下創(chuàng)建一個strtus.properties配置文件 2.可以在web.xml文件中配置
3.可以直接在strtus.xml文件中定義常量(推薦)
注意:后加載的配置文件中的常量會將先加載的常量覆蓋
第9章 Struts2的Action詳解
Struts2中的action,主要是完成業(yè)務邏輯操作。Action替代在servlet中完成的作用。
黑馬程序員鄭州中心 編著
Action的學習主要有兩點
1.如何創(chuàng)建一個struts2的action 2.如果訪問一個struts2的action
1. Action類創(chuàng)建方式(三種)1.創(chuàng)建一個pojo類
Pojo(plani Ordinary java object)簡單的java對象 Pojo類就是沒有實現(xiàn)任何接口沒有繼承任何類 優(yōu)點:無耦合
缺點:所有的功能都要自己完成
2.創(chuàng)建一個類實現(xiàn)一個Action接口
com.opensymphony.xwork2.Action
在Action接口中定義了五個常量,一個execute方法 五個常量:它們是默認的五個結果視圖: ERROR : 錯誤視圖
INPUT: 它是struts2框架中interceptor中發(fā)現(xiàn)問題后會訪問的一個視圖 LOGIN:它是一個登錄視圖,可以在權限操作中使用
黑馬程序員鄭州中心 編著
NONE:它代表的是null,什么都不做(也不會做跳轉操作)SUCCESS:這是一個成功視圖 優(yōu)點:耦合度低
缺點:還是需要自己來完成功能
3.創(chuàng)建一個類繼承ActionSupport類
com.opensymphony.xwork2.ActionSupport ActionSupport類也實現(xiàn)了Action接口。我們在開發(fā)中一般會使用這種方案: 優(yōu)點:具有豐富的功能,例如
表單校驗 錯誤信息設置
國際化 缺點:耦合度高
9.1 action的訪問方式
1.直接通過標簽來配置,通過method來指定訪問的方法,如果method沒有,默認訪問的是execute方法。
2.簡化的action訪問方式,可以使用*通配符來訪問。
這種方式的缺點:不建議使用過多的*號,它帶來程序閱讀障礙,不便于理解 使用*來簡化操作方案,它對名稱規(guī)范必須進行一個統(tǒng)一。
黑馬程序員鄭州中心 編著
9.2 擴展--動態(tài)方法調用
這是strtus2提供的動態(tài)方法調用。
注意:對于strtus2的動態(tài)方法調用,要想使用我們必須配置一個常量來開啟動態(tài)方法調用
這代表動態(tài)方法調用沒有開啟
黑馬程序員鄭州中心 編著
個人不建議使用動態(tài)方法調用
第10章 Struts2框架封裝數(shù)據(jù)
主要解決的問題:是在action中如果獲取請求參數(shù)
主要有兩種方式: 1.屬性驅動
a.直接在action類中提供與請求參數(shù)匹配屬性,提供get/set方法
b.在action類中創(chuàng)始一個javaBean,對其提供get/set,在請求時頁面上要進行修改,例如 user.username user.password ,要使用ognl表達式
以上兩種方式的優(yōu)缺點: 第一種比較簡單,在實際操作我們需要將action的屬性在賦值給模型(javaBean)去操作 第二種:不需要在直接將值給javaBean過程,因為直接將數(shù)據(jù)封裝到了中。它要求在頁面上必須使用ognl表達式,就存在頁面不通用問題。javaBean
2.模型驅動
步驟: 1.讓Action類要實現(xiàn)一個指定接口ModelDriven 2.實例化模型對象(就是要new出來javaBean)3.重寫getModel方法將實例化的模型返回。
黑馬程序員鄭州中心 編著
對于模型驅動它與屬性驅動對比,在實際開發(fā)中使用比較多,模型驅動缺點,它只能對
一個模型數(shù)據(jù)進行封裝。
第11章 總結
今天主要內容是圍繞著簡單的登錄案例來講解: 1.關于strtus2框架的環(huán)境搭建 2.關于strtus2框架配置 3.關于strtus2框架請求參數(shù)封裝 4.關于strtus2框架的路徑跳轉
關于action訪問的配置
黑馬程序員鄭州中心 編著
namespace=””
extends=””> class=””
method=””>
路徑
關于路徑跳轉問題: 是通過來配置跳轉的路徑.它的name屬性是與action中的方法的返回值進行對比的。它的type屬性可以取哪些值?
默認值是dispatcher 它代表的是請求轉發(fā)。針對于jsp頁面 redirect 它代表的是重定向
針對于jsp頁面
chain 它類似于請示轉發(fā),只不過它是針對于action跳轉.redirectAction 它類似于重定向
針對于action 關于路徑跳轉的配置
可以直接在
下創(chuàng)建全局的result
黑馬程序員鄭州中心 編著
黑馬程序員鄭州中心 編著
【黑馬程序員】Java基礎 : Java語句筆記
摘要: Java基礎—java語句這些是黑馬程序員java基礎入門的一個很重要的內容。今天主要給大家簡單講解一下Java基礎—java語句,以后會慢慢講解黑馬程序員的課程內容!
關鍵語句介紹
一、while 語句 一般形式:
whi l e(條件表達式){ 語句體 ……… } 執(zhí)行過程:
條件表達式為真,執(zhí)行語句體。否則,退出!
二、do while 語句 一般形式: do { 語句體 …….} while(條件表達式);執(zhí)行過程:
先執(zhí)行一次語句體,判斷 條件表達式是否為真,為真再執(zhí)行do語句中的語句體。為假,退出。
需要注意:與whi l e語句區(qū)別
黑馬程序員合肥中心 編著
1.while(條件表達式)后面有分號;2.不管條件表達式是否為真,語句體均會執(zhí)行一次。
三、for 語句 一般形式:
for(子句 1;子句 2;子句 3){ 語句體 …… } 執(zhí)行過程:
四、break、cont inue 語句 break 退出所在循環(huán) : int stopHere = 5;for(int i=1;i<8;i++){ if(i == stopHere){ break;} System.out.println(“i = ” + i);
黑馬程序員合肥中心 編著
} //打印結果:5,6,7,8均沒有打印出來。
需要注意的一個問題: int stopHere = 5;for(int i = 1;i < 8;i + +){ if(i = = stopHere){ / /語句體 } break;System.out.println(“i = ” + i);} 這個時候編譯器會報錯:無效的 System.out 輸出語句。冷靜分析一下:
break 語句會結束循環(huán),所以不會再去執(zhí)行 System.out 輸出語句。編譯會認為你在多此一舉,sorry 報個錯!
continue 退出本次循環(huán),不會退出整個循環(huán): int skipHere = 5;for(int i = 1;i < 8;i + +){ if(i = = skipHere){ continue;}
黑馬程序員合肥中心 編著
System.out.println(“i = ” + i);} / /打印結果:除了5沒有打印出來。
i = 1 i = 2
五、switch 語句 一般形式: switch(常量){ case 表達式1:語句體1;break;case 表達式2:語句體2;break;.....default : 語句體n;break;}
執(zhí)行過程: 執(zhí)行過程:
case 根據(jù)自己的表達式看是否匹配常量,如果匹配就執(zhí)行語句體,否則執(zhí)行 default 語句。
case 執(zhí)行類似于并行操作,不是順序操作。所以各個表達式的值不可以相同。
黑馬程序員合肥中心 編著
哪個 case 匹配常量就會執(zhí)行自己的語句體,不會再去尋找其他 case 語句。注意:
<1> case 穿透:省去break關鍵字
[AppleScript] 純文本查看 復制代碼 ?
01 /**
02 * @author 傳智播客 03 */
04 int i = 10;05 switch(i){ 06 case 10:
07 System.out.println(“ A”);08 //break;09 case 5: System.out.println(“ B”);11 //break;12 case 7: System.out.println(“ C”);14 //break;15 default : System.out.println(“ error”);17 break;18 }//打印結果:A B C error
<2> 在 Java 編程中 switch 括號中的常量的數(shù)據(jù)類型只可以為 int 類型或者是 byte、char、short(因為 byte、char、short 可以自動提升為 int),常量類型不可以是 long、float 和 double 等數(shù)據(jù)類型。<3> 多個 case 可以合并 , 相當于 “ 或 ”,例如下面 i 等于 10、5、7 都可以執(zhí)行打印語句。
[AppleScript] 純文本查看 復制代碼 ?
01 /**
02 * @author 傳智播客 03 */
04 int i = 5;05 switch(i){ 06 case 10: 07 case 5: 08 case 7:
09 System.out.println(“ C”);10 break;11 default : System.out.println(“ error”);13 break;
黑馬程序員合肥中心 編著 }//打印結果:C <4> default 語句可以省,但是不推薦,他后面的 break 可省 <5> case 或者 default 子句中可以寫多條語句 case 7: System.out.println(“ C”);if(i == 5){ System.out.println(“ i = ” +i);} break;<6> case 或者 default 子句中還可以嵌套 switch 或者其他語句
六、return 語句
終止方法的運行并指定要返回的數(shù)據(jù)。兩種形式:
<1> return 表達式;
<2> return ;沒有任何數(shù)據(jù)直接返回,結束函數(shù)(方法)的執(zhí)行。
七、if 語句
一般形式:
1.if(條件表達式){ 語句體} 2.if(條件表達式){ 語句體} else{語句體 } 3. if(條件表達式1){ 語句體} else if(條件表達式2){語句體 } else {語句體 }
特別注意:形式3,else與其最近的上個if 配對。例子:
[AppleScript] 純文本查看 復制代碼 ?
黑馬程序員合肥中心 編著
01 /**
02 * @author 傳智播客 03 */
04 public class TestIF {
05 public static void main(String[] args){ 06 int i = 30;07 if(i < 20){
08 System.out.println(“<20”);09 } else if(i < 50){ System.out.println(“<50”);11 } else if(i < 80){ System.out.println(“<80”);13 } else System.out.println(“>=80”);15 System.out.println(“黑馬程序員!”);16 }
如果大家想學習java基礎的知識,歡迎大家可以去傳智播客官網(wǎng)http://www.tmdps.cn/去了解java基礎知識!
黑馬程序員合肥中心 編著
01、什么是3G 02、android系統(tǒng)簡介 03、android背景介紹 04、android的framewor簡介 05、兩種虛擬機的比較 06、sdk的下載以及簡介 07、創(chuàng)建android模擬器 08、ddms簡介
09、platform-tools的簡介及常見adb指令
10、android項目的目錄結構
11、android下apk安裝的過程
12、常見的adb指令介紹
13、創(chuàng)建模擬器遇到的常見錯誤
14、電話撥號器
15、點擊事件的四種寫法
16、短信發(fā)送器
17、相對布局&單位介紹
18、現(xiàn)形布局&布局的組合
19、表格布局&絕對布局 20、幀布局
21、測試相關概念
22、android下junit測試框架配置
23、logcat簡介
24、保存文件到手機內存
25、android下文件訪問的權限
26、保存文件到SD卡中
27、分析setting源代碼獲取SD卡大小
28、_sharePreference入門
29、xml文件的序列化 30、采用pull解析xml文件
31、采用斷電調試的方法觀察pull解析的的流程
32、android下創(chuàng)建一個sqllite數(shù)據(jù)庫
33、sql語句實現(xiàn)數(shù)據(jù)庫的增刪改查
34、系統(tǒng)api實現(xiàn)數(shù)據(jù)庫的增刪改查&Sqlite3工具的使用
35、數(shù)據(jù)庫的事物
36、listView入門
37、采用layoutInflater打氣筒創(chuàng)建一個view對象
38、采用數(shù)據(jù)適配器ArryAdapter
39、常用數(shù)據(jù)適配器simpleAdapter 40、數(shù)據(jù)適配器總結
41、內容提供者簡介
42、內容提供者的實現(xiàn)
43、短信的備份
44、插入一條記錄到系統(tǒng)短信應用
45、內容觀察者
46、獲取系統(tǒng)的聯(lián)系人信息
47、保存聯(lián)系人到系統(tǒng)通訊錄
48、讀取聯(lián)系人的一個小細節(jié)
49、網(wǎng)絡圖片查看器
50、anr產生的原理&如何避免
51、android消息機制入門
52、網(wǎng)絡html查看器
53、字符亂碼問題的處理
54、采用get方式提交數(shù)據(jù)到服務器
55、采用post方式提交數(shù)據(jù)到服務器
56、提交數(shù)據(jù)到服務器中文亂碼問題的處理
57、采用httpclient提交數(shù)據(jù)到服務器
58、異步http框架簡介&實現(xiàn)原理
59、異步http框架提交數(shù)據(jù)到服務器 60、上傳文件到服務器
61、smartimageview&常見開源代碼 62、多線程下載的原理 63、多線程斷點下載的原理
64、多線程java代碼移植到android 65、多線程下載文本頁面的更新 66、顯示意圖激活另一個activity 67、隱式意圖激活另一個activity 68、隱式意圖的配置
69、隱式意圖和顯示意圖的使用場景 70、在不同activity之間數(shù)據(jù)傳遞 71、activity的聲明周期 72、activity的啟動模式
73、activity橫豎屏切換的聲明周期 74、開啟新的activity獲取他的返回值 75、請求碼和結果碼的作用 76、利用廣播實現(xiàn)ip撥號 77、短信竊聽器
78、自定義廣播時間&發(fā)送自定義廣播&廣播接受者優(yōu)先級 79、采用服務執(zhí)行長期后臺操作 80、采用服務竊聽電話&服務的聲明周期 81、android進程優(yōu)先級&為什么使用服務 82、綁定方式開啟服務&調用服務的方法 83、服務的聲明周期(混合開啟 84、采用aidl綁定遠程服務
85、代碼注冊廣播接受者&利用廣播調用服務的辦法 86、加載大圖片到內存 87、獲取圖片exif信息 88、從gallery獲取圖片 89、圖片畫畫板 90、扒開美女衣服 91、圖片的縮放 92、圖片的旋轉
93、圖片的平移&鏡面&倒影效果 94、圖片的合成 95、圖片的顏色處理 96、多媒體播放api簡介 97、人臉識別
98、mediaplayer的生命周期 99、soundpoo簡介
100、sufaceview的生命周期 101、播放在線視頻
102、視頻播放器進度的處理 103、調用系統(tǒng)照相機拍照和錄像 104、采用camera拍照 105、常見對話框 106、notification入門 107、菜單
108、android下的樣式 109、android下的主題
110、代碼編寫ui 111、html創(chuàng)建ui 112、幀動畫
113、代碼創(chuàng)建創(chuàng)建的tween動畫 114、xml文件定義動畫 115、傳感器簡介 116、117、殺死進程 118、apk的安裝 119、應用程序的反編譯 120、動態(tài)創(chuàng)建fragment 121、用fragment創(chuàng)建一個選項卡 122、fragment的向下兼容性 123、fragment的生命周期 124、fragment之間的通訊 125、應用程序國際化
04、android的framewor簡介
Wap:wait and play Wireless Makeup Language(WML)精簡的html語言 Applications:android自帶的基本上層應用 Aplication framework:應用程序框架 Librarics: Linux lernel:
05、兩種虛擬機的比較
編譯后文件格式:
jvm:.java->.class->.jar dalvik vm:.java->.dex->.odex 基于的架構:
jvm:基于棧的架構
dalvik vm:基于寄存器的架構
Cpu直接訪問寄存器因此dalvik虛擬機的效率比jvm高
06、sdk的下載以及簡介
->獲取sdk工具包(sdk:standard develope kits)->ADT(android develop tools,實際上是eclipse的插件)SDK具體內容
Android 4.2.2(API16)
->SDK Plateform:開發(fā)時使用到的jar包->Samples for sdk:
->ARM EABI V7a System Image:模擬器運行時的鏡像->Intel n86 Aton System:模擬器運行時的鏡像->MIPS System Image:模擬器運行時的鏡像->google APIs:google提供的jar包,可以直接使用google提供的一些API->source for android SDK:SDK全部的源代碼 Extrals:
->tools:開發(fā)的工具
->support library:實現(xiàn)高版本的android向下的兼容->google Admed Ads SDK:gongle提供的廣告插件->Analyties App Irackiong SDK:應用的用戶分析->cloud message:云消息
->gongle play service:收費服務
->google USB Driver:真實的設備驅動
開發(fā)時:基于4.0,兼容2.2、2.3.3
07、創(chuàng)建android模擬器
avd:android virture developer VGA:480*640(電視的標準分辨率)QVGA:240*320(四分之一)HVGA:320*480(一半)WVGA:480*800(width)FWVGA:480*854(更寬)
08、ddms簡介
ddms:模擬器不支持中文,因此發(fā)送中文會顯示不出來
09、platform-tools的簡介及常見adb指令
Android調試橋:內部實現(xiàn)就是socket讓兩個系統(tǒng)之間實現(xiàn)數(shù)據(jù)交互
->reset adb:模擬器找不到時候可以重啟->adb device:列出所有的連接的設備->adb kill-server:殺死adb調試橋->adb start-server 啟動adb調試橋 dx.bat:將.class文件打包
10、android項目的目錄結構
一:SDK的目錄結構
->Samples->Api demo:根據(jù)API demo(模擬器上面可以看見)的效果可以在sample中看見
相應的代碼
->Source:jar包所有的sdk源代碼都在這個文件夾里->SystemImage:系統(tǒng)鏡像
->temp:下載更新臨時存儲的文件夾,一般是空的->tools:emulater.ext 不同版本的模擬器
二:New Android Application->theme:留給以后作為擴展,現(xiàn)在并沒有太大的作用->target SDK:一般選擇高版本,因為高版本對下兼容
->mark project as a library:一般不選擇,意思是將這個項目提供一個
jar包供別人使用 三:文件夾目錄
.setting:設置目錄
assets:資產目錄,存放一些文件,這些文件會被原封不動打包到應用程序的 apk中
bin:
gen:自動生成的目錄
->builderConfig.java:生成的配置信息->R.java: Android 4.1.2->android.jar開發(fā)環(huán)境,jar包
可以在properties中修改,jar包就是SDK
011、Android下apk的安裝過程
一、Android安裝過程分析:
->setContentView:甚至view的對象,把里面的xml文件加載到
->在project中選擇build automaticly會自動把文件生成字節(jié)碼文件,.class $代表的class文件生成的是內部類->dex.bat文件會把.class文件生成.dex文件
->apk壓縮文件解壓內部內容
->META-INF: 應用程序的簽名
eclipse的調試簽名文件
->res:資源文件
->classes.dex:class文件
->resources.arsc:資源ID映射
->android軟件安裝的過程:
->拷貝xxx.apk帶/data/app/xxx-1.apk->在/data/data目錄下創(chuàng)建一個文件夾,文件夾名稱當前應用程序的報名
012、常見adb指令
前提:
->設備連接上電腦而且驅動安裝正常,如果安裝不正常的話,會有黃色的問號顯示;
->設備上打開USB調試;
指令:
->adb device(如果啟動發(fā)現(xiàn)這個程序沒有安裝會自動安裝)->adb kill-server->adb start-server->adb uninstall <包名>->adb-s emulator-5554 install c:usersadministratorhello.apk 如果有多個設備的話,如果不指定安裝的是哪個設備程序會報錯->adb push haha.prop /sdcard/haha.txt 將文件移到
(360管家,豌豆莢之類的軟件他們也是用的adb指令,倘若電腦上裝這些軟件的話,會因為兩個adb指令搶端口號而掛掉)(adb版本之間兼容不是很好,經(jīng)常報錯可以考慮下版本的問題)->adb shell:遠程連接到了android的linux終端
ls:顯示文件夾
ps:顯示正在運行的程序 ping:網(wǎng)絡連通性
013、創(chuàng)建模擬器遇到的常見錯誤
->路徑最好不要有中文:
->應用安裝不上,或者安裝模擬器的時候開啟一個新的模擬器:
可能是模擬器的資源被占用,模擬器在運行的時候其實占用著硬盤上面的一個文件,這個文件位于工作空間.android/avd/iphone.avd 里面會有鏡像文件,當一個模擬器開啟起來了,就給你創(chuàng)建一個文件夾.knock的文件夾,代表著這個模擬器被鎖定了,如果把模擬器關掉,就沒有程序占據(jù)這幾個鏡像資源了,那么這幾個程序就會被自動刪除。通常情況下不會出問題,開啟時候創(chuàng)建文件,關閉時關閉文件,但是當電腦出現(xiàn)不正常狀態(tài)時:比如藍屏,停電關機時候這些資源還沒來得及刪除,模擬器就關閉了,因此開啟時這些資源仍在,程序默認模擬器被占用,因此會重新開啟一個模擬器。
->模擬器沒有信號:
模擬器用socket橋接在電腦上
終結解決方案是給電腦連上網(wǎng),分配一個IP->常見命令操作:
14、電話撥號器
->新建文件
->界面設置:文本框、點擊按鈕
-> :一旦獲得焦點,會立刻彈出,輸入文本的軟鍵盤->ctrl+x刪除->ctrl+1提示
->設置點擊事件:找到空間,然后設置點擊事件,再點擊事件里面獲得了另外一
個空間的數(shù)據(jù),激活一個intent->獲得權限:清單文件中添加uses permision
15、點擊事件的四種寫法
->電話撥號器的優(yōu)化:
每次撥打電話都會執(zhí)行的操作是:查找控件,然后找到控件的文本,撥打電
話。其實每次撥打電話文本控件已經(jīng)創(chuàng)建好了沒有必要每次查找按鈕之后再 查詢控件。
package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(new MyListener());}
private class MyListener implementsandroid.view.View.OnClickListener{
@Override
public void onClick(View arg0){
String number = et_number.getText().toString().trim();//去除回車和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “號碼不能為空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);
}
}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;} }
->
1、點擊事件的四種寫法:
->給按鈕注冊點擊事件:創(chuàng)建一個內部類定義點擊事件。具體代碼見上
button.setOnClickListener(new MyListener());
->
2、采用匿名內部類創(chuàng)建點擊事件:
button.setOnClickListener(new OnClickListener()){
package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0){
// TODO 自動生成的方法存根
callPhone();
}
});}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
private void callPhone(){
String number = et_number.getText().toString().trim();//去除回車和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “號碼不能為空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);} } }
->
3、如果有很多的按鈕點擊事件,建議用這種方式:讓Activity實現(xiàn)點擊 事件的接口,每個按鈕點擊事件都設置成this,讓該類實現(xiàn) OnClickListener然后進行判斷。package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(this);}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
private void callPhone(){
String number = et_number.getText().toString().trim();//去除回車和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “號碼不能為空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);}
@Override public void onClick(View v){
// TODO 自動生成的方法存根
switch(v.getId()){
case R.id.bt_dial:
callPhone();
break;
} } }->
4、在布局文件中綁定一個點擊的方法,如果點擊按鈕就會調用這個方法,通
過反射技術試圖調用這個方法
布局文件中設置: package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);
}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
public void dialButtonClick(View v){ callPhone();}
private void callPhone(){
String number = et_number.getText().toString().trim();//去除回車和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “號碼不能為空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);} }
16、短信發(fā)送器
->界面的設計:兩個large Text,一個Button
android:textColor 設置字體顏色
android:singleLine=“true” 設置是否是單行
android:lines=“5” 設置行數(shù)
windows下面的顏色是GBR,而android下需要輸入的格式確實
RGB,所以需要轉換
adb默認設置time out為5秒->內容設計:按鈕-文本->判斷->發(fā)送
導包的時候千萬別導到gsm包,否則會顯示過時;
發(fā)送沒有歷史記錄 package com.example.sms;
import java.util.ArrayList;
import android.app.Activity;import android.os.Bundle;import android.telephony.SmsManager;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private EditText et_number;private EditText et_content;
@Override protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button =(Button)findViewById(R.id.bt_send);
et_number =(EditText)findViewById(R.id.et_number);
et_content =(EditText)findViewById(R.id.et_content);
button.setOnClickListener(this);}
@Override public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);
return true;}
@Override public void onClick(View v){
// TODO 自動生成的方法存根
switch(v.getId()){
case R.id.bt_send:
String number = et_number.getText().toString().trim();
String content = et_content.getText().toString().trim();
if(TextUtils.isEmpty(number)||TextUtils.isEmpty(content)){
Toast.makeText(this, “號碼或者內容不能為空”,Toast.LENGTH_SHORT).show();
return;
}else{
SmsManager smsManager = SmsManager.getDefault();
ArrayList contents = smsManager.divideMessage(content);
for(String str:contents){
smsManager.sendTextMessage(number, null, str, null, null);
}
}
} } }
17、相對布局&單位介紹
->布局說明:
->同級控件:
android:layout_toRightOf=“" android:layout_toLeftOf=”“ android:layout_below=”' android:layout_above=“" android:layout_maginBottom=”“
->相對父控件:
android:ayout_centerInParent=”“ android: layout_centerHorizontal=”“ android:layout_centerVertical=”“ android:layout_alignParentBottom=”“ android:layout_alignParentRight=”“->對齊方式:
->文本顏色:#00000000~#ff000000(argb)文字的透明度->單位介紹:
dp也就是dip:device independent pixels(設備獨立像素),是一種與密度無關的像素單位,在每英寸160點的屏幕上,1dp = 1px。不同設備有不同的顯示效果,這個和設備硬件有關,一般我們?yōu)榱酥С諻VGA、HVGA和QVGA 推薦使用這個,不依賴像素
1.2.android:layout_height=”wrap_content“
3.android:text=”@string/clickme“
4.android:layout_marginTop=”20dp“ />
scaled pixels(刻度像素).主要用于定義字體的大小,而從來不再layout上使用
o
1.2.android:layout_height=”wrap_content“
3.android:textSize=”20sp“ />
px:pixels(像素).不同設備顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多 總結:dp也就是dip。這個和sp基本類似。如果設置表示長度、高度等屬性時可以使用dp或sp。但如果設置字體,需要使用sp。dp是與密度無關,sp除了與密度無關外,還與scale無關。如果屏幕密度為160,這時dp和sp和px是一樣的。1dp=1sp=1px,但如果使用px作單位,如果屏幕大小不變(假設還是3.2寸),而屏幕密度變成了320。那么原來TextView的寬度設成160px,在密度為320的3.2寸屏幕里看要比在密度為160的3.2寸屏幕上看短了一半。但如果設置成160dp或160sp的話。系統(tǒng)會自動將width屬性值設置成320px的。也就是160 * 320 / 160。其中320 / 160可稱為密度比例因子。也就是說,如果使用dp和sp,系統(tǒng)會根據(jù)屏幕密度的變化自動進行轉換.附:px 和 dp 互轉換
1.package com.hujl.util;import android.content.Context;
public class DensityUtil {
/**
* 根據(jù)手機的分辨率從 dp 的單位轉成為 px(像素)
*/
public static int dip2px(Context context, float dpValue){
final float scale = context.getResources().getDisplayMetrics().density;
return(int)(dpValue * scale + 0.5f);
}
/**
* 根據(jù)手機的分辨率從 px(像素)的單位轉成為 dp
*/
public static int px2dip(Context context, float pxValue){
final float scale = context.getResources().getDisplayMetrics().density;
return(int)(pxValue / scale + 0.5f);
} }
18、線性布局&布局的組合
->線性布局:
->線:就是view對象
android:layout_height=”1px“
android:background=”#ff0000“ > />
通常采用相對布局和絕對布局聯(lián)合使用的方式。
19、表格布局&絕對布局
->表格布局:渲染權重
->絕對布局:對控件位置任意擺放,需要計算不同屏幕中的位置,因為android
軟件的屏幕大小實在太多,所以并不方便,不推薦使用。
20、幀布局
>幀布局:
->類似于網(wǎng)頁布局中的div
android:visibility:”“ //顯示是否可見,播放器最喜歡使用幀布局,暫停播放的時候,會在上面顯示一個按鈕
21、測試相關概念
->根據(jù)測試測試是否知道程序的源代碼:
->黑盒測試:不知道源代碼,只關心程序執(zhí)行的過程和程序的結果,一個資
深的黑盒程序人員工資很高,因為他們和正常用戶的使用思維
不一樣
->白盒測試:根據(jù)源代碼寫測試方法或者測試用例->根據(jù)測試的粒子度:
->方法測試:function test->單元測試:unit test->集成測試:intergration test->根據(jù)測試的次數(shù):
->冒煙測試:smoke test 反復不停的執(zhí)行,反復不停的使用(android猴子
來測試)
->adb shell
->monkey
->monkey 5000(點擊五千次)
->壓力測試:pressure test同時抗住多人的請求->
22、android下junit測試框架配置
23、logcat簡介
->日志信息級別:
Verbose:提醒 黑色
Debug: 調試 藍色
Info: 信息 綠色
Warn: 警告 橙色
Error: 錯誤 紅色
24、保存文件到手機內存
->數(shù)據(jù)存儲與訪問
->文件
->SharePreferences(參數(shù))
->SQLite數(shù)據(jù)庫
->內容提供者(Content Provide)
->網(wǎng)絡
->LinearLayout一定要設置水平還是垂直->文件保存:
->javase中通過創(chuàng)建文件對象,但是在androi中這種存放方式會失敗,因
為會默認為存儲在當前目錄文件下
->android中創(chuàng)建一個包:com.itheima.login.service
創(chuàng)建一個類:LoginService.java
異常的處理:如果是返回值是boolean,那么拋出處理都可以,但是如果返回值是void,那么只能拋出了
->context:上下文就是一個類,這個類提供了很多方便的API,可以得到應用程
序的環(huán)境
環(huán)境包名 安裝路徑 文件的路徑 資源的路徑 資產的路徑
放到緩存文件夾里面:getCacheDir();->getAssest();->getResource();->getFilesDir();/data/data/包名
->getCacheDir();/data/data/包名/cache
->MainActivity.java package com.example.login;
import java.util.Map;
import android.app.Activity;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;
import com.example.login.service.LoginService;
public class MainActivity extends Activity {
private EditText et_number;private EditText et_passwd;private CheckBox cb_remPass;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//首先要把頁面加載進來然后才有控件的獲取
et_number =(EditText)findViewById(R.id.et_number);
et_passwd =(EditText)findViewById(R.id.et_passwd);
cb_remPass =(CheckBox)findViewById(R.id.cb_remPass);
Map map = LoginService.getSavaUserInfo(this);
if(map!= null){
et_number.setText((CharSequence)map.get(”username“));
et_passwd.setText((CharSequence)map.get(”passwd“));
} }
@Override public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);
return true;} public void login(View v){
String number = et_number.getText().toString().trim();
String passwd = et_passwd.getText().toString().trim();
if(TextUtils.isEmpty(number)||TextUtils.isEmpty(passwd)){
Toast.makeText(this, ”登錄名或者密碼不能為空“, Toast.LENGTH_SHORT).show();
return;
}else{
if(cb_remPass.isChecked()){
//如果選擇了保存用戶密碼,那么就保存用戶密碼
boolean results = LoginService.saveuserInfo(this,number, passwd);
if(results){
Toast.makeText(this, ”保存用戶信息成功“, Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, ”保存用戶信息失敗“, Toast.LENGTH_SHORT).show();
}
}
//登陸發(fā)送消息到服務器,服務器驗證是否正確
if(”zhangsan“.equals(number)&&”123456“.equals(passwd)){
Toast.makeText(this, ”登陸成功“, Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this, ”登錄失敗,用戶名或者密碼不正確“, Toast.LENGTH_LONG).show();
}
} } }
->LoginService.java package com.example.login.service;
import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.util.HashMap;import java.util.Map;
import android.content.Context;/* * 保存用戶名密碼的的業(yè)務方法 */ public class LoginService { public static boolean saveuserInfo(Context context,String userName,String passWord){//沒有使用任何類的方法,推薦使用靜態(tài)方法
//File file = new File(”/data/data/com.example.login/info.txt“);
File file = new File(context.getFilesDir(),”info.txt“);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write((userName+”##“+passWord).getBytes());
fos.close();
return true;
} catch(FileNotFoundException e){
// TODO 自動生成的 catch 塊
e.printStackTrace();
return false;
} catch(IOException e){
// TODO 自動生成的 catch 塊
e.printStackTrace();
return false;
}
} /* * 獲取保存到的數(shù)據(jù)
*/ public static Map getSavaUserInfo(Context context){
File file = new File(context.getFilesDir(),”info.txt“);
Map map = new HashMap();;
try {
FileInputStream fis = new FileInputStream(file);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fis));
String str = bufferedReader.readLine();
String[] infos = str.split(”##“);
map.put(”username“, infos[0]);
map.put(”passwd“, infos[1]);
} catch(FileNotFoundException e){
// TODO 自動生成的 catch 塊
e.printStackTrace();
return null;
} catch(IOException e){
// TODO 自動生成的 catch 塊
e.printStackTrace();
return null;
}
return map;} }
->activity_main.xml
android:id=”@+id/bt_login“
android:onClick=”login“
android:layout_width=”100dp“
android:layout_height=”wrap_content“
android:layout_alignParentRight=”true“
android:text=”@string/bt_login“
/>
android:id=”@+id/cb_remPass“
android:layout_width=”wrap_content“
android:layout_height=”wrap_content“
android:layout_alignParentLeft=”true“
android:layout_alignParentTop=”true“
android:layout_alignBottom=”@id/bt_login“
android:text=”@string/remPass“
android:checked=”true“ />
25、android下文件訪問的權限
->private、readable、writeable、public
26、保存文件到SD卡中
->存儲空間:
->手機的內部存儲空間:小硬盤 /data/data->外部存儲空間:SD卡 路徑/mnt/sdcard 可以簡寫成/sdcard/
需要權限WRITE_EXTER_STORAGE
操作SD卡必須要權限
->保存數(shù)據(jù)到SD卡只需要把路徑改為SD卡,讀不需要權限,否則需要權限
在4.0以前的版本讀SD卡不需要權限,但是在4.0以
后讀寫SD卡可以設置SD卡保護,讀就需要權限 READ_EXTER_STORAGE->判斷是否存在SD卡:Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
->為了保證程序的兼容性,有些SD卡可能路徑會改變,因此系統(tǒng)提供了獲取SD 卡的路徑的方法
Environment.getExternalStorageDirectory()
27、分析setting源代碼獲取SD卡大小
->source的源代碼是SDK的源代碼,是jar里面的源代碼->導入通用的文件項目eclipse要求必須要有setting文件->ctrl+h搜索文件夾
package com.example.sdsize;
import java.io.File;
import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.os.StatFs;import android.text.format.Formatter;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;
public class MainActivity extends Activity {
private TextView tv_SDsize;protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button =(Button)findViewById(R.id.bt_find);tv_SDsize =(TextView)findViewById(R.id.tv_SDSize);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0){
// TODO 自動生成的方法存根
StringBuilder memorySizeInfo = new StringBuilder();
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
memorySizeInfo.append(getExternalSize());
}else{
Toast.makeText(MainActivity.this,”無內存卡“, Toast.LENGTH_SHORT).show();
}
memorySizeInfo.append(getRomSpaceInfo());
tv_SDsize.setText(memorySizeInfo.toString());
}
});} /* * 獲取SD卡的存儲信息 */ public String getExternalSize(){
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
long availableBlocks = stat.getAvailableBlocks();
long totalSize = blockSize*totalBlocks;
long availSize = blockSize*availableBlocks;
String totalStr = Formatter.formatFileSize(this, totalSize);
String availStr = Formatter.formatFileSize(this, availSize);
String ExternalSize = ”SD總存儲空間:“+ totalStr + ”可使用的空間:“ + availStr;
return ExternalSize;} /* * 獲取可用的內部存儲 */ public String getRomSpaceInfo(){
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long internalblockSize = stat.getBlockSize();
long internalblockcounts = stat.getBlockCount();
long internaltotalSize = internalblockSize*internalblockcounts;
String totalStr = Formatter.formatFileSize(this, internaltotalSize);
String RomSpaceInfo = ”可用的內存“+ totalStr;
} return RomSpaceInfo;} @Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
28、sharedPreferences入門
->數(shù)據(jù)存儲的API:用##分割用戶名和密碼的缺陷,真實存
儲的話必須要把##轉移成其他字符,sharePreferences
(共享參數(shù))提供了一種方便存儲數(shù)據(jù)的方式。
->在data目錄下創(chuàng)建了一個xml文件,根節(jié)點是map,其實是以map集合來存
儲的用戶名和密碼的對特殊字符進行了轉義
package loginsharedPreference.service;
import android.content.Context;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;
/* * 保存用戶名密碼的的業(yè)務方法 */ public class LoginService { public static void SavaUserInfo(Context context,String username,String passwd){
//拿到上下文之后,有個方法叫getSharedPreferences
SharedPreferences sharedPreferences = context.getSharedPreferences(”config“, Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();//得到sharedPreferences的編輯器
}
editor.putString(”username“,username);editor.putString(”passwd“,passwd);//類似于數(shù)據(jù)庫的事物
editor.commit();//當前方法不會存在異常,所以設置為void } package loginsharedPreference;
import java.util.Map;
import loginsharedPreference.service.LoginService;import android.app.Activity;import android.content.SharedPreferences;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;
import com.example.login.R;
public class MainActivity extends Activity {
private EditText et_number;private EditText et_passwd;private CheckBox cb_remPass;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//首先要把頁面加載進來然后才有控件的獲取
et_number =(EditText)findViewById(R.id.et_number);
et_passwd =(EditText)findViewById(R.id.et_passwd);
cb_remPass =(CheckBox)findViewById(R.id.cb_remPass);
SharedPreferences sharedPreferences = getSharedPreferences(”config“,MODE_PRIVATE);
String username = sharedPreferences.getString(”username“, ”“);
String passwd = sharedPreferences.getString(”passwd“, ”“);
et_number.setText(username);
et_passwd.setText(passwd);
}
@Override public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);
return true;} public void login(View v){
String number = et_number.getText().toString().trim();
String passwd = et_passwd.getText().toString().trim();
if(TextUtils.isEmpty(number)||TextUtils.isEmpty(passwd)){
Toast.makeText(this, ”登錄名或者密碼不能為空“, Toast.LENGTH_SHORT).show();
return;
}else{
if(cb_remPass.isChecked()){
//如果選擇了保存用戶密碼,那么就保存用戶密碼
LoginService.SavaUserInfo(this,number, passwd);
Toast.makeText(this, ”保存用戶信息成功“, Toast.LENGTH_SHORT).show();
}
//登陸發(fā)送消息到服務器,服務器驗證是否正確
if(”zhangsan“.equals(number)&&”123456“.equals(passwd)){
Toast.makeText(this, ”登陸成功“, Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this, ”登錄失敗,用戶名或者密碼不正確“, Toast.LENGTH_LONG).show();
}
} } }
29、xml文件的序列化
->一個小異常:如果沒有識別這個設備,重啟的話要記得吧adb殺掉->自己手動添加,這種方式效率低,容易出錯->XmlSerializer:XML序列化生成器
30、采用pull解析xml文件
->用于對象的持久化,將對象寫到硬盤中,需要用的時候再反序列化取出來。
所謂序列化其實就是將程序中的數(shù)據(jù)(對象)通過某種方式,保存到本地中。然后可以在程序關閉之后還保存程序的某個執(zhí)行狀態(tài),方便在程序下次
執(zhí)行的時候通過”反序列化“讀取出來,并且能夠還原數(shù)據(jù)的類型,從而延續(xù)程序退出時的狀態(tài)。
一般來說,我們會使用序列化保存一些需要持久化的數(shù)據(jù),當然如果這個數(shù)據(jù)會比較龐大的話,我們就直接使用數(shù)據(jù)庫了!所以,序列化實際上目前很多領域用的已經(jīng)不多了,大部分使用 都已被數(shù)據(jù)庫替代了!
序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發(fā)的問題。序列化的實現(xiàn):將需要被序列化的類實現(xiàn)Serializable接口,該接口沒有需要實現(xiàn)的方法,implements Serializable只是為了標注該對象是可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStrea
->xml文件的解析方式:
->DOM一次將XML文件加載進內存,生成樹狀結構,在內存中對樹狀結構進
行操作,缺點是消耗內存大,->SAX解析:基于事件的方式,自上而下,事件下去了就不能解析了,優(yōu)點
是速度快,效率高,缺點是不能倒退;
->android下增加了一種解析xml文件的方式,pull解析,類似于SAX解析,定義了一個指針,指向了文檔的開頭,得到指針,一個tag一個tag的解析下去
->利用類加載器走到文件->創(chuàng)建一個解析器:pullParse0
具體代碼:
(MainActivity.java)package com.example.xml;
import java.util.List;
import org.w3c.dom.Text;
import com.example.xml.domain.WeatherInfo;import com.example.xml.service.WeatherService;
import android.support.v7.app.ActionBarActivity;import android.support.v7.app.ActionBar;import android.support.v4.app.Fragment;import android.app.Activity;import android.os.Bundle;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import android.os.Build;
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv =(TextView)findViewById(R.id.tv);
List weatherInfos = WeatherService.getWeatherInfos(MainActivity.class.getClassLoader().getResourceAsStream(”weather.xml“));
StringBuilder sb = new StringBuilder();
for(WeatherInfo info:weatherInfos){
sb.append(info.toString()+”n“);
}
tv.setText(sb.toString());}
@Override public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);
return true;} }
(WeatherInfo.java)/** * */ package com.example.xml.domain;
import android.R.integer;/** * @author yonghen * */ public class WeatherInfo { private int id;private String name;private String wind;private String weather;private String temp;private String pm;/*(non-Javadoc)* @see java.lang.Object#toString()*/ @Override public String toString(){
return ”WeatherInfos [id=“ + id + ”, name=“ + name + ”, wind=“ + wind
+ ”, weather=“ + weather + ”, temp=“ + temp + ”, pm=“ + pm
+ ”]“;}
/** * @param id * @param name * @param wind * @param weather
* @param temp * @param pm */ public WeatherInfo(){ super();} public WeatherInfo(int id, String name, String wind, String weather,String temp, String pm){ super();this.id = id;this.name = name;this.wind = wind;this.weather = weather;this.temp = temp;this.pm = pm;} /** * @return the id */ public int getId(){ return id;} /** * @param id the id to set */ public void setId(int id){ this.id = id;} /** * @return the name */ public String getName(){ return name;} /** * @param name the name to set */ public void setName(String name){ this.name = name;} /** * @return the wind */
public String getWind(){ return wind;} /** * @param wind the wind to set */ public void setWind(String wind){ this.wind = wind;} /** * @return the weather */ public String getWeather(){ return weather;} /** * @param weather the weather to set */ public void setWeather(String weather){ this.weather = weather;} /** * @return the temp */ public String getTemp(){ return temp;} /** * @param temp the temp to set */ public void setTemp(String temp){ this.temp = temp;} /** * @return the pm */ public String getPm(){ return pm;} /** * @param pm the pm to set */ public void setPm(String pm){ this.pm = pm;
}
}
(WeatherService.java)/** * */ package com.example.xml.service;
import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;
import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;
import android.R.integer;import android.util.Xml;
import com.example.xml.domain.WeatherInfo;/** * @author yonghen * */ public class WeatherService { public static List getWeatherInfos(InputStream inputStream){
XmlPullParser xmlPullParser = Xml.newPullParser();
WeatherInfo weatherInfo = null;
List weatherInfos = null;
try {
xmlPullParser.setInput(inputStream, ”utf-8“);
int type = xmlPullParser.getEventType();//拿到的是當前的事件類型:
while(type!= xmlPullParser.END_DOCUMENT){
switch(type){
case XmlPullParser.START_TAG:
if(”info“.equals(xmlPullParser.getName())){//解析到全局開始的標簽
weatherInfos = new ArrayList();
}else if(”city“.equals(xmlPullParser.getName())){
weatherInfo = new WeatherInfo();
String idString = xmlPullParser.getAttributeName(0);
weatherInfo.setId(Integer.parseInt(idString));//字符串轉化成整型數(shù)據(jù)
}else if(”temp“.equals(xmlPullParser.getName())){
String temp = xmlPullParser.nextText();
weatherInfo.setTemp(temp);
}else if(”wind“.equals(xmlPullParser.getName())){
String wind = xmlPullParser.nextText();
weatherInfo.setWind(wind);
}else if(”name“.equals(xmlPullParser.getName())){
String name = xmlPullParser.nextText();
weatherInfo.setName(name);
}else if(”weather“.equals(xmlPullParser.getName())){
String weather = xmlPullParser.nextText();
weatherInfo.setName(weather);
}else if(”pm“.equals(xmlPullParser.getName())){
String pm = xmlPullParser.nextText();
weatherInfo.setPm(pm);
}
break;
case XmlPullParser.END_TAG:
if(”city“.equals(xmlPullParser.getName())){
weatherInfos.add(weatherInfo);
weatherInfo=null;
}
break;
}
type = xmlPullParser.next();
}
} catch(XmlPullParserException e){
// TODO Auto-generated catch block
e.printStackTrace();
} catch(IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
return weatherInfos;} }(Weather.xml)
20/30
5月20日 多云轉晴
南風3-4
上海
200
20/30
5月19日 多云轉晴
南風3-4
上海
200
20/30
5月18日 多云轉晴
南風3-4
上海
200
20/30
5月17日 多云轉晴
南風3-4
上海
200
31、采用斷點調試的方法觀察pull解析的的流程
->現(xiàn)在代碼雙單擊添加斷點
->debug as Android Application->然后打開調試視圖
32、android下創(chuàng)建一個sqllite數(shù)據(jù)庫
->SQLiteOpenHelper(數(shù)據(jù)庫大概幫助類):數(shù)據(jù)庫創(chuàng)建和打開的幫助類->
->PersonSQLiteOpenHelper.java /** * */ package com.example.sqlite;
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;/** * @author yonghen * */ public class PersonSQLiteHelper extends SQLiteOpenHelper {
/**
* @數(shù)據(jù)庫的構造方法,用來定義數(shù)據(jù)庫的名稱,數(shù)據(jù)庫查詢的結果集,數(shù)據(jù)庫的版本 */ public PersonSQLiteHelper(Context context){//Context:上下文告訴數(shù)據(jù)庫存放在什么位置,String name:數(shù)據(jù)庫名,factory一般為null,設置系統(tǒng)默認的游標工廠,super(context, ”Person.db“, null, 1);
} /* * 數(shù)據(jù)庫第一次被創(chuàng)建的時候調用的方法,db創(chuàng)建的數(shù)據(jù)庫 */ @Override public void onCreate(SQLiteDatabase db){
db.execSQL(”create table person id integer primary antoincrement,name varchar(20),number varchar(20)");//底層存儲類型都是String,(20)都是給程序員看的,其實沒有影響
}
/*(non-Javadoc)* @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)*/ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ } }
->TestPersonDB.java /** * */ package com.example.sqlite;
import android.database.sqlite.SQLiteAbortException;import android.database.sqlite.SQLiteDatabase;import android.test.AndroidTestCase;/** * @author yonghen * */ public class TestPersonDB extends AndroidTestCase { public void testCreateDB(){ PersonSQLiteHelper personSQLiteHelper = new PersonSQLiteHelper(getContext());//new出來一個對象,實際上數(shù)據(jù)庫并未被真正的創(chuàng)建,測試框架提供了一個獲取Context的方法
personSQLiteHelper.getWritableDatabase();//數(shù)據(jù)庫才會被真正的創(chuàng)建出來, } }
33、sql語句實現(xiàn)數(shù)據(jù)庫的增刪改查
->javaweb:
->加載到jdbc的驅動;//android已經(jīng)集成在framework->鏈接到數(shù)據(jù)庫;//只要拿到數(shù)據(jù)庫的引用
->準備sql語句 增刪改查
->增加:insert into person(name,number)values('zhang','110')->刪除:delete from person where name = 'zhangsan'->修改:update person set number = '119' where name = 'zhangsan'->查找:select * from person->查找具體:select * from person where name = 'zhangsan'
->PersonSQLiteHelper.java /** * */ package com.example.sqlite;
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;/** * @author yonghen * */ public class PersonSQLiteHelper extends SQLiteOpenHelper {
/** * @數(shù)據(jù)庫的構造方法,用來定義數(shù)據(jù)庫的名稱,數(shù)據(jù)庫查詢的結果集,數(shù)據(jù)庫的版本
*/ public PersonSQLiteHelper(Context context){//Context:上下文告訴數(shù)據(jù)庫存放在什么位置,String name:數(shù)據(jù)庫名,factory一般為null,設置系統(tǒng)默認的游標工廠,
【黑馬程序員】PHP課程同步筆記day18:PHP函數(shù)
PHP函數(shù) 1.概念
將一段常用的功能代碼,進行封裝,然后起個名字,叫”函數(shù)” 使用函數(shù),可以減少我們的工作量。對于后期的項目維護,十分方便。2.函數(shù)定義格式
Function functionName(形參1,形參2,形參3......){
函數(shù)的功能代碼
[return 參數(shù)r] } 函數(shù)語法格式說明:
Function是系統(tǒng)關鍵字,不分大小寫。
functionName是自定義的函數(shù)名稱。函數(shù)名的命名規(guī)則與變量一樣,只是不加$符號。
()定義函數(shù)時的參數(shù),該參數(shù)又稱為”形參”。
形式參數(shù):主要用來接收調用函數(shù)者,傳遞過來的數(shù)據(jù)。
形參可以是多個,多個形參之間用逗號隔開,也可以沒有形參
形參其實就是一個變量的名稱,主要用來臨時存儲數(shù)據(jù)的。{}是函數(shù)的功能代碼。Return語句:
向誰返回內容?誰調用了該函數(shù),就向誰返回。
返回什么內容?該內容的類型不限制,可以是任何數(shù)據(jù)類型
黑馬程序員濟南中心 編著
Return語句,一旦執(zhí)行,函數(shù)將中止。也就是return語句之后的函數(shù)代碼不再執(zhí)行。
Return 語句返回一個值,并退出函數(shù)。
3.函數(shù)調用
函數(shù)定義是不會自動執(zhí)行的。函數(shù)必須要經(jīng)過調用,才能看到結果 調用函數(shù)和定義函數(shù)不分順序。4.函數(shù)參數(shù)
a)形式參數(shù)(形參):形參主要用來接收調用函數(shù)傳遞過來的數(shù)據(jù)。
i.形參一般是變量,不能是具體的值
ii.形參只能在函數(shù)內部使用
b)實際參數(shù)(實參):向定義函數(shù)傳遞的數(shù)據(jù)
i.實參可以是具體值,也可以是一個變量
c)形參和實參的個數(shù),一般情況下必須一致 Function showInfo($a){ Echo “OK”;} $a = 100;showInfo($a);函數(shù)參數(shù)傳遞 1.值傳遞(拷貝傳值)將一個變量的值,”拷貝”一份,傳給形參
黑馬程序員濟南中心 編著
在函數(shù)內部,對形參進行了修改,而函數(shù)外的這個變量不會改變 函數(shù)內的形參,與函數(shù)外的實參,是相互獨立的,沒有任何聯(lián)系的
在PHP中,默認”值傳遞”的有:字符型、整型、浮點型、布爾型、數(shù)組、NULL
2.引用傳遞
將一個變量的地址傳給形參,即形參與變量指向的是”同一物”.變量和參數(shù)之間是相互聯(lián)系,修改一個,另一個會跟著變。
參數(shù)在使用引用傳遞時,需要在”形參”前加一個”&”符號。”實參”前不能添加。
默認引用傳地址:資源和對象
黑馬程序員濟南中心 編著
3.默認參數(shù)
PHP支持默認參數(shù)。
當實參格式少于形參個數(shù)時,那么少的那個實參可以用末日的形參來代替
匿名函數(shù)
1.概念
沒有名字的函數(shù)就是匿名函數(shù),它不能單獨定義也不能單獨調用 匿名函數(shù)一般用來給其他變量賦值的。
黑馬程序員濟南中心 編著
2.匿名函數(shù)的兩種用法
i.將匿名函數(shù)當成一個數(shù)據(jù),賦給其他變量
ii.將匿名函數(shù)作為函數(shù)的參數(shù)來使用
變量作用域
變量作用域:就是變量生效的范圍
在PHP中三種變量作用域:全局變量、局部變量、超全局變量。1.全局變量
全局變量:在函數(shù)外部定義的變量,稱為”全局變量”。
黑馬程序員濟南中心 編著
全局變量,在網(wǎng)頁執(zhí)行完畢,就消失了。在JS中,全局變量,可以直接在函數(shù)內部來使用 在PHP中,全局變量不能直接在函數(shù)內部使用 2.局部變量
局部變量:在函數(shù)內部定義的變量,稱為”局部變量”。局部變量,只能在函數(shù)內部來使用 局部變量,在函數(shù)執(zhí)行完畢后就消失了。3.在局部作用域中訪問全局變量---global關鍵字
Global關鍵字,只能在函數(shù)內部來使用
不能在使用global關鍵字時,直接給變量賦值。只能是先聲明為全局,再賦值。
$GLOBALS超全局數(shù)組
“超全局數(shù)組變量”可以在網(wǎng)頁的任何地方使用,包括函數(shù)內部和函數(shù)外部。$GLOBALS超全局數(shù)組中包含的內容有:$_GET、$_POST、$_COOKIE、$_FILES
黑馬程序員濟南中心 編著
【黑馬程序員】PHP課程同步筆記day17:數(shù)組介紹
數(shù)組 1.數(shù)組的概念
數(shù)組是一組值的集合,變量是單個值的容器,而數(shù)組是多個值的容器 2.數(shù)組的分類
1.枚舉數(shù)組:數(shù)組的下標是從0開始的正整數(shù)
2.關聯(lián)數(shù)組:數(shù)組的下標可以是字符串
$arr = array(“db_host” => “l(fā)ocalhost”, “db_user” => “root”, “db_pwd” =>”root”,);
3.混合數(shù)組:下標既有整型的,也有字符串的
$arr = array(“db_host” => “l(fā)ocalhost”, “db_user” => “root”, “db_pwd” =>”root”, “黑馬程序員”, “濟南分校”);
4.多維數(shù)組:數(shù)組的元素的值的類型是一個數(shù)組。數(shù)組套數(shù)組。數(shù)組元素的下標只能是正整數(shù)和字符串。數(shù)組元素的值,可以是任何類型,當然可以是數(shù)組。
黑馬程序員濟南中心 編著
$arr = array(Array(10,11,12,13), Array(20,21,22), Array(30,31), TRUE,NULL);3.數(shù)組的創(chuàng)建
a)使用array()來創(chuàng)建數(shù)組 $arr = array([$key=>]$value, [$key=>]$value, [$key=>]$value,.....);語法說明:
$key代表數(shù)組元素的下標,可以省略。
$key的類型可以是整型和字符型,如果$key省略,默認的數(shù)組應該是枚舉數(shù)組。$value代表數(shù)組元素的值,值可以是任何類型。“=>”重載下標,或者重新指定下標。多個數(shù)組元素之間用英文下的逗號隔開。b)使用[]創(chuàng)建數(shù)組的語法
語法1:$arr[] = $value
黑馬程序員濟南中心 編著
說明: 1)如果數(shù)組不存在,則會創(chuàng)建一個數(shù)組 2)第一個元素就是下標為0的元素 3)如果數(shù)組存在,則相當于添加一個新元素 4)新元素的下標,應該是最大整數(shù)下標+1 語法2: $arr[$key] = $value 說明:
1)同時指定下標,指定的下標是多少,就是多少。2)如果指定的數(shù)組不存在,也會創(chuàng)建一個數(shù)組 3)如果指定的數(shù)組存在,則添加一個新元素 $arr[] = 100;$arr[] = 200;$arr[5] = 500;$arr[“a”] = “abc”;多維數(shù)組
1、使用array()來創(chuàng)建多維數(shù)組
$arr = array(Array(10,11,12,13,14), Array(20,21,22,23), Array(30,31,32), Array(Array(40,41),黑馬程序員濟南中心 編著
Array(42,43)));
2、使用[]來創(chuàng)建多維數(shù)組
$arr[“name”] = “Mary”;$arr[“sex”] = “男”;$arr[“contact”][“tel”] = “11111111111”;$arr[“contact”][“qq”] = “11233321”;$arr[] = array(10,20,30);實例:用表格輸出二維數(shù)組 $arr = array(Array(“10010”,”Mary”,”大專”,”傳智專修學院”), Array(“10020”,”Kate”,”大專”,”傳智專修學院”), Array(“10030”,”James”,”大專”,”傳智專修學院”), Array(“10040”,”Kobe”,”大專”,”傳智專修學院”),);$str = “”;$str.= “
” For($i = 0;$i”;For($j=0;$j”.$arr[$i][$j].””;黑馬程序員濟南中心 編著
} $str.= “”;} $str.= “
”;Echo $str;數(shù)組操作函數(shù) 1.print_r()a)描述:打印變量信息
b)語法:print_r(mixed $expression)c)說明:如果給出的是string、interger或float,將打印變量值本身。如果給出的是array,將會按照一定格式顯示鍵和元素
2.Count()a)描述:統(tǒng)計數(shù)組有效數(shù)據(jù)的個數(shù)
b)說明:計算數(shù)組中的單元數(shù)目或對象中的屬性個數(shù)。c)語法:int count(mixed $var)d)參數(shù):$mode是否統(tǒng)計多維數(shù)組中的個數(shù) 3.Unset()a)描述:刪除變量或數(shù)組元素或者對象屬性 b)語法:void unset(mixed $var)c)返回值:無
d)注意:如果刪除變量的話,只是刪除變量名稱和到值之間的指向。如果刪除數(shù)組元素的話,值會被刪除,而下標還在。如果刪除整個數(shù)組的話,而整個數(shù)組都不存在黑馬程序員濟南中心 編著
了。
實例:求一維數(shù)組中元素的平均值 $arr = array(1,2,3,4,5,6,7,8);$num = 0;$len = count($arr);For($i=0;$i<$len;++$i){ $sum += $arr[$i];} Echo “平均值為:”.$sum/$len;實例:求二維數(shù)組中元素的平均值 $arr = array(Array(10,11,12,13,14), Array(20,21,22,23), Array(30,31,32), Array(40,41), Array(50));$sum = 0;$len = 0;For($i = 0;$i黑馬程序員濟南中心 編著
$len ++;} } Echo “平均值:”.round($sum/$len,2);實例:求一維數(shù)組中的最大值 $arr = array(9,2,3,45,5,7);$max = $arr[0];For($i=0;$iIf($max<$arr[$i]){
黑馬程序員濟南中心 編著
$max = $arr[$i];$max_index = $i;} //最小值
If($min>$arr[$i]){ $min = $arr[$i];$min_index = $i;} } //交換最大值和最小值的位置 $arr[$max_index] = $min;$arr[$min_index] = $max;數(shù)組遍歷:foreach 語法結構:
Foreach($arr as [$key=>]$value){循環(huán)體代碼} 語法結構說明:
$arr代表當前要遍歷的數(shù)組名稱 As是系統(tǒng)關鍵字
$key表示每一次取到元素的鍵名,可以省略 $value表示每一次取到元素的鍵值 如果數(shù)組指針指到數(shù)組的末端,則退出循環(huán) 實例:foreach遍歷一維數(shù)組
黑馬程序員濟南中心 編著
$arr = array(“name” => “Mary”, “sex” => “男”, “age” => 24);Foreach($arr as $key=>$value){ Echo “$arr[$key]=$value ”;} 實例:foreach遍歷二維數(shù)組 $arr = array(“a” =>array(“10010”,”Mary”,”男”,24), “b”=>array(“10020”,”Kate”,”女”,20), “c” => array(“10030”,”Kobe”,”男”,40));$str = “”;$str.=”
”;Foreach($arr as $arr2){ $str.=””;Foreach($arr2 as $value){ $str.=”$value ”;} $str.=” ”;黑馬程序員濟南中心 編著
} $str.=”
”;Echo $str;實例:foreach 中的$value引用傳地址 $arr = array(1,2,3,4,5,6,7,8);Foreach($arr as &$value){ $value *=2;} Var_dump($arr);數(shù)組操作函數(shù) 1.each()a)描述:返回數(shù)組中當前的鍵/值對(數(shù)組元素)并將數(shù)組指針向前移動一步 b)語法:array each(array &$array)c)返回值:返回array數(shù)組中當前指針位置的鍵/值對并向前移動數(shù)組指針。鍵值對被返回四個單元的數(shù)組。單元0和key包含有數(shù)組單元的鍵名,1和value包含有數(shù)據(jù)。
2.List()a)描述:把數(shù)組中的值(前幾個值)賦給一些變量 b)語法:array list(mixed $varname)c)舉例:list($name,$sex,$age)= array(“Kobe”,”男”,24,”高中”);i.說明:將數(shù)組中前三個元素的值,賦給list函數(shù)中的三個變量。
ii.數(shù)組中多余的值不需要
黑馬程序員濟南中心 編著
iii.要求數(shù)組必須是枚舉數(shù)組,下標必須是從0開始的正整數(shù) iv.下標必須是連續(xù)的,中間不能斷檔。
黑馬程序員濟南中心 編著