① java中對資料庫的操作Statement和PrepareStatement這兩個方法有什麼不同它們是一個類還是一個方法
它們是JDBC提供的類:statement 與preparestatement 區別 1.
PreparedStatement對象不僅包含了sql語句,而且大多數情況下這個語句已經被預編譯過,因而當其執行時,只需DBMS運行SQL語句,而不必先編譯。當你需要執行Statement對象多次的時候,PreparedStatement對象將會大大降低運行時間,當然也加快了訪問資料庫的速度。這種轉換也給你帶來很大的便利,不必重復SQL語句的句法,而只需要更改其中變數的值,便可重新執行SQL語句。選擇 PreParedStatement對象與否,在於相同的句法的SQL語句是否執行了多次,而且兩次之間的差別僅僅是變數不同,如果僅僅執行了一次的話,它應該和普通的對象毫無差異,體現不出她預編譯的優越性。 2.prepareStatement是把你的sql語句預先「編譯」好,每次只替換定義的變數,
他的作用是減少與資料庫的通信量,從而加快執行速度,主要用在循環執行SQL語句 3.
prepareStatement已經予編譯,速度比Statement快些
prepareStatement解決有關特殊字元插入到資料庫的問題。如(',",),?) 4.
Statement ─ 由方法 createStatement 所創建。Statement 對象用於發送簡單的 SQL 語句。
PreparedStatement ─ 由方法 prepareStatement 所創建。PreparedStatement 對象用於發送帶有一個或多個輸入參數( IN 參數)的 SQL 語句。PreparedStatement 擁有一組方法,用於設置 IN 參數的值。執行語句時,這些 IN 參數將被送到資料庫中。PreparedStatement 的實例擴展了 Statement ,因此它們都包括了 Statement 的方法。PreparedStatement 對象有可能比 Statement 對象的效率更高,因為它已被預編譯過並存放在那以供將來使用。
CallableStatement ─ 由方法 prepareCall 所創建。CallableStatement 對象用於執行 SQL 儲存程序 ─ 一組可通過名稱來調用(就象函數的調用那樣)的 SQL 語句。CallableStatement 對象從 PreparedStatement 中繼承了用於處理 IN 參數的方法,而且還增加了用於處理 OUT 參數和 INOUT 參數的方法。
以下所列提供的方法可以快速決定應用哪個 Connection 方法來創建不同類型的 SQL 語句:
createStatement 方法用於:
簡單的 SQL 語句(不帶參數)
prepareStatement 方法用於:
帶一個或多個 IN 參數的 SQL 語句
經常被執行的簡單 SQL 語句
prepareCall 方法用於:
調用已儲存過程 Statement用法 stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); prepareStatement用法
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();
Statement沒有設置緩存,prepareStatement有,並且一次性可以插入n個數據 利用PreparedStatement對象提高資料庫的總體效率
在使用PreparedStatement對象執行SQL命令時,命令被資料庫進行解析和編譯,然後被放到命令緩沖區。然後,每當執行同一個 PreparedStatement對象時,它就會被再解析一次,但不會被再次編譯。在緩沖區中可以發現預編譯的命令,並且可以重新使用。在有大量用戶的企業級應用軟體中,經常會重復執行相同的SQL命令,使用PreparedStatement對象帶來的編譯次數的減少能夠提高資料庫的總體性能。如果不是在客戶端創建、預備、執行PreparedStatement任務需要的時間長於Statement任務,我會建議在除動態SQL命令之外的所有情況下使用PreparedStatement對象
② 額,聯想的本本,開機有時會出現 prepare boot to os 無法啟動,關機拔電池電源後等 十分鍾左右,能啟動了
我的電腦-屬性-高級-啟動和故障恢復-設置-高級-虛擬內存更改-根據上述說明設置比最大值小點就行...
③ 連接池裡緩存PreparedStatement有什麼用
關於prepare的優勢:它是相同sql,不同參數的反復調用。其他方面沒有任何優勢。所以適合大量數據處理的場合。
希望我的回答能夠幫助到你
④ 關於J2EE的幾個問題
HQL查詢:
Criteria查詢對查詢條件進行了面向對象封裝,符合編程人員的思維方式,不過HQL(Hibernate Query Lanaguage)查詢提供了更加豐富的和靈活的查詢特性,因此Hibernate將HQL查詢方式立為官方推薦的標准查詢方式,HQL查詢在涵蓋Criteria查詢的所有功能的前提下,提供了類似標准SQL語句的查詢方式,同時也提供了更加面向對象的封裝。完整的HQL語句形勢如下:
Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc
其中的update/delete為Hibernate3中所新添加的功能,可見HQL查詢非常類似於標准SQL查詢。由於HQL查詢在整個Hibernate實體操作體系中的核心地位,這一節我將專門圍繞HQL操作的具體技術細節進行講解。
1、 實體查詢:
有關實體查詢技術,其實我們在先前已經有多次涉及,比如下面的例子:
String hql=」from User user 」;
List list=session.CreateQuery(hql).list();
上面的代碼執行結果是,查詢出User實體對象所對應的所有數據,而且將數據封裝成User實體對象,並且放入List中返回。這里需要注意的是,Hibernate的實體查詢存在著對繼承關系的判定,比如我們前面討論映射實體繼承關系中的Employee實體對象,它有兩個子類分別是HourlyEmployee,SalariedEmployee,如果有這樣的HQL語句:「from Employee」,當執行檢索時Hibernate會檢索出所有Employee類型實體對象所對應的數據(包括它的子類HourlyEmployee,SalariedEmployee對應的數據)。
因為HQL語句與標准SQL語句相似,所以我們也可以在HQL語句中使用where字句,並且可以在where字句中使用各種表達式,比較操作符以及使用「and」,」or」連接不同的查詢條件的組合。看下面的一些簡單的例子:
from User user where user.age=20;
from User user where user.age between 20 and 30;
from User user where user.age in(20,30);
from User user where user.name is null;
from User user where user.name like 『%zx%』;
from User user where (user.age%2)=1;
from User user where user.age=20 and user.name like 『%zx%』;
2、 實體的更新和刪除:
在繼續講解HQL其他更為強大的查詢功能前,我們先來講解以下利用HQL進行實體更新和刪除的技術。這項技術功能是Hibernate3的新加入的功能,在Hibernate2中是不具備的。比如在Hibernate2中,如果我們想將資料庫中所有18歲的用戶的年齡全部改為20歲,那麼我們要首先將年齡在18歲的用戶檢索出來,然後將他們的年齡修改為20歲,最後調用Session.update()語句進行更新。在Hibernate3中對這個問題提供了更加靈活和更具效率的解決辦法,如下面的代碼:
Transaction trans=session.beginTransaction();
String hql=」update User user set user.age=20 where user.age=18」;
Query queryupdate=session.createQuery(hql);
int ret=queryupdate.executeUpdate();
trans.commit();
通過這種方式我們可以在Hibernate3中,一次性完成批量數據的更新,對性能的提高是相當的可觀。同樣也可以通過類似的方式來完成delete操作,如下面的代碼:
Transaction trans=session.beginTransaction();
String hql=」delete from User user where user.age=18」;
Query queryupdate=session.createQuery(hql);
int ret=queryupdate.executeUpdate();
trans.commit();
如果你是逐個章節閱讀的化,那麼你一定會記起我在第二部分中有關批量數據操作的相關論述中,討論過這種操作方式,這種操作方式在Hibernate3中稱為bulk delete/update,這種方式能夠在很大程度上提高操作的靈活性和運行效率,但是採用這種方式極有可能引起緩存同步上的問題(請參考相關論述)。
3、 屬性查詢:
很多時候我們在檢索數據時,並不需要獲得實體對象所對應的全部數據,而只需要檢索實體對象的部分屬性所對應的數據。這時候就可以利用HQL屬性查詢技術,如下面程序示例:
List list=session.createQuery(「select user.name from User user 」).list();
for(int i=0;i
System.out.println(list.get(i));
}
我們只檢索了User實體的name屬性對應的數據,此時返回的包含結果集的list中每個條目都是String類型的name屬性對應的數據。我們也可以一次檢索多個屬性,如下面程序:
List list=session.createQuery(「select user.name,user.age from User user 」).list();
for(int i=0;i
Object[] obj=(Object[])list.get(i);
System.out.println(obj[0]);
System.out.println(obj[1]);
}
此時返回的結果集list中,所包含的每個條目都是一個Object[]類型,其中包含對應的屬性數據值。作為當今我們這一代深受面向對象思想影響的開發人員,可能會覺得上面返回Object[]不夠符合面向對象風格,這時我們可以利用HQL提供的動態構造實例的功能對這些平面數據進行封裝,如下面的程序代碼:
List list=session.createQuery(「select new User(user.name,user.age) from User user 」).list();
for(int i=0;i
User user=(User)list.get(i);
System.out.println(user.getName());
System.out.println(user.getAge());
}
這里我們通過動態構造實例對象,對返回結果進行了封裝,使我們的程序更加符合面向對象風格,但是這里有一個問題必須注意,那就是這時所返回的User對象,僅僅只是一個普通的Java對象而以,除了查詢結果值之外,其它的屬性值都為null(包括主鍵值id),也就是說不能通過Session對象對此對象執行持久化的更新操作。如下面的代碼:
List list=session.createQuery(「select new User(user.name,user.age) from User user 」).list();
for(int i=0;i
User user=(User)list.get(i);
user.setName(「gam」);
session.saveOrUpdate(user);//這里將會實際執行一個save操作,而不會執行update操作,因為這個User對象的id屬性為null,Hibernate會把它作為一個自由對象(請參考持久化對象狀態部分的論述),因此會對它執行save操作。
}
4、 分組與排序
A、Order by子句:
與SQL語句相似,HQL查詢也可以通過order by子句對查詢結果集進行排序,並且可以通過asc或者desc關鍵字指定排序方式,如下面的代碼:
from User user order by user.name asc,user.age desc;
上面HQL查詢語句,會以name屬性進行升序排序,以age屬性進行降序排序,而且與SQL語句一樣,默認的排序方式為asc,即升序排序。
B、Group by子句與統計查詢:
在HQL語句中同樣支持使用group by子句分組查詢,還支持group by子句結合聚集函數的分組統計查詢,大部分標準的SQL聚集函數都可以在HQL語句中使用,比如:count(),sum(),max(),min(),avg()等。如下面的程序代碼:
String hql=」select count(user),user.age from User user group by user.age having count(user)>10 」;
List list=session.createQuery(hql).list();
C、優化統計查詢:
假設我們現在有兩張資料庫表,分別是customer表和order表,它們的結構如下:
customer
ID varchar2(14)
age number(10)
name varchar2(20)
order
ID varchar2(14)
order_number number(10)
customer_ID varchar2(14)
現在有兩條HQL查詢語句,分別如下:
from Customer c inner join c.orders o group by c.age;(1)
select c.ID,c.name,c.age,o.ID,o.order_number,o.customer_ID
from Customer c inner join c.orders c group by c.age;(2)
這兩條語句使用了HQL語句的內連接查詢(我們將在HQL語句的連接查詢部分專門討論),現在我們可以看出這兩條查詢語句最後所返回的結果是一樣的,但是它們其實是有明顯區別的,語句(1)檢索的結果會返回Customer與Order持久化對象,而且它們會被置於Hibernate的Session緩存之中,並且Session會負責它們在緩存中的唯一性以及與後台資料庫數據的同步,只有事務提交後它們才會從緩存中被清除;而語句(2)返回的是關系數據而並非是持久化對象,因此它們不會佔用Hibernate的Session緩存,只要在檢索之後應用程序不在訪問它們,它們所佔用的內存就有可能被JVM的垃圾回收器回收,而且Hibernate不會同步對它們的修改。
在我們的系統開發中,尤其是Mis系統,不可避免的要進行統計查詢的開發,這類功能有兩個特點:第一數據量大;第二一般情況下都是只讀操作而不會涉及到對統計數據進行修改,那麼如果採用第一種查詢方式,必然會導致大量持久化對象位於Hibernate的Session緩存中,而且Hibernate的Session緩存還要負責它們與資料庫數據的同步。而如果採用第二種查詢方式,顯然就會提高查詢性能,因為不需要Hibernate的Session緩存的管理開銷,而且只要應用程序不在使用這些數據,它們所佔用的內存空間就會被回收釋放。
因此在開發統計查詢系統時,盡量使用通過select語句寫出需要查詢的屬性的方式來返回關系數據,而避免使用第一種查詢方式返回持久化對象(這種方式是在有修改需求時使用比較適合),這樣可以提高運行效率並且減少內存消耗。㊣真正的高手並不是精通一切,而是精通在合適的場合使用合適的手段。
5、 參數綁定:
Hibernate中對動態查詢參數綁定提供了豐富的支持,那麼什麼是查詢參數動態綁定呢?其實如果我們熟悉傳統JDBC編程的話,我們就不難理解查詢參數動態綁定,如下代碼傳統JDBC的參數綁定:
PrepareStatement pre=connection.prepare(「select * from User where user.name=?」);
pre.setString(1,」zhaoxin」);
ResultSet rs=pre.executeQuery();
在Hibernate中也提供了類似這種的查詢參數綁定功能,而且在Hibernate中對這個功能還提供了比傳統JDBC操作豐富的多的特性,在Hibernate中共存在4種參數綁定的方式,下面我們將分別介紹:
A、 按參數名稱綁定:
在HQL語句中定義命名參數要用」:」開頭,形式如下:
Query query=session.createQuery(「from User user where user.name=:customername and user:customerage=:age 」);
query.setString(「customername」,name);
query.setInteger(「customerage」,age);
上面代碼中用:customername和:customerage分別定義了命名參數customername和customerage,然後用Query介面的setXXX()方法設定名參數值,setXXX()方法包含兩個參數,分別是命名參數名稱和命名參數實際值。
B、 按參數位置邦定:
在HQL查詢語句中用」?」來定義參數位置,形式如下:
Query query=session.createQuery(「from User user where user.name=? and user.age =? 」);
query.setString(0,name);
query.setInteger(1,age);
同樣使用setXXX()方法設定綁定參數,只不過這時setXXX()方法的第一個參數代表邦定參數在HQL語句中出現的位置編號(由0開始編號),第二個參數仍然代表參數實際值。
註:在實際開發中,提倡使用按名稱邦定命名參數,因為這不但可以提供非常好的程序可讀性,而且也提高了程序的易維護性,因為當查詢參數的位置發生改變時,按名稱邦定名參數的方式中是不需要調整程序代碼的。
C、 setParameter()方法:
在Hibernate的HQL查詢中可以通過setParameter()方法邦定任意類型的參數,如下代碼:
String hql=」from User user where user.name=:customername 」;
Query query=session.createQuery(hql);
query.setParameter(「customername」,name,Hibernate.STRING);
如上面代碼所示,setParameter()方法包含三個參數,分別是命名參數名稱,命名參數實際值,以及命名參數映射類型。對於某些參數類型setParameter()方法可以更具參數值的Java類型,猜測出對應的映射類型,因此這時不需要顯示寫出映射類型,像上面的例子,可以直接這樣寫:
query.setParameter(「customername」,name);但是對於一些類型就必須寫明映射類型,比如java.util.Date類型,因為它會對應Hibernate的多種映射類型,比如Hibernate.DATA或者Hibernate.TIMESTAMP。
D、 setProperties()方法:
在Hibernate中可以使用setProperties()方法,將命名參數與一個對象的屬性值綁定在一起,如下程序代碼:
Customer customer=new Customer();
customer.setName(「pansl」);
customer.setAge(80);
Query query=session.createQuery(「from Customer c where c.name=:name and c.age=:age 」);
query.setProperties(customer);
setProperties()方法會自動將customer對象實例的屬性值匹配到命名參數上,但是要求命名參數名稱必須要與實體對象相應的屬性同名。
這里還有一個特殊的setEntity()方法,它會把命名參數與一個持久化對象相關聯,如下面代碼所示:
Customer customer=(Customer)session.load(Customer.class,」1」);
Query query=session.createQuery(「from Order order where order.customer=:customer 」);
query. setProperties(「customer」,customer);
List list=query.list();
上面的代碼會生成類似如下的SQL語句:
Select * from order where customer_ID=』1』;
E、 使用綁定參數的優勢:
我們為什麼要使用綁定命名參數?任何一個事物的存在都是有其價值的,具體到綁定參數對於HQL查詢來說,主要有以下兩個主要優勢:
①、 可以利用資料庫實施性能優化,因為對Hibernate來說在底層使用的是PrepareStatement來完成查詢,因此對於語法相同參數不同的SQL語句,可以充分利用預編譯SQL語句緩存,從而提升查詢效率。
②、 可以防止SQL Injection安全漏洞的產生:
SQL Injection是一種專門針對SQL語句拼裝的攻擊方式,比如對於我們常見的用戶登錄,在登錄界面上,用戶輸入用戶名和口令,這時登錄驗證程序可能會生成如下的HQL語句:
「from User user where user.name=』」+name+」』 and user.password=』」+password+」』 」
這個HQL語句從邏輯上來說是沒有任何問題的,這個登錄驗證功能在一般情況下也是會正確完成的,但是如果在登錄時在用戶名中輸入」zhaoxin or 『x』=』x」,這時如果使用簡單的HQL語句的字元串拼裝,就會生成如下的HQL語句:
「from User user where user.name=』zhaoxin』 or 『x』=』x』 and user.password=』admin』 」;
顯然這條HQL語句的where字句將會永遠為真,而使用戶口令的作用失去意義,這就是SQL Injection攻擊的基本原理。
而使用綁定參數方式,就可以妥善處理這問題,當使用綁定參數時,會得到下面的HQL語句:
from User user where user.name=』』zhaoxin』』 or 『』x=』』x』』 『 and user.password=』admin』;由此可見使用綁定參數會將用戶名中輸入的單引號解析成字元串(如果想在字元串中包含單引號,應使用重復單引號形式),所以參數綁定能夠有效防止SQL Injection安全漏洞。
⑤ prepare 和 be prepared
prepare 是個常用動詞,也是一個多義詞。它既可以作及物動詞用,也可作不及物動詞用。為了弄清它的用法,現將它的主要用法歸納如下,供同學們在學習中參考。
一 . prepare 作「准備;預備;籌備;製作;配製」解時,可用於以下場合:
1. prepare + 名詞或代詞。例如:
He has prepared his lessons.
他已備好課了。
After arriving home, she began to make a fire and prepare supper.
到家以後,她開始生爐子,准備晚飯。
The chemist is preparing a medicine.
葯劑師正在配葯。
Corn is a very useful plant which can be prepared in many different ways.
玉米是一種非常有用的作物,可用許多不同的方法將其製作成食品。
2. prepare + 雙賓語(間接賓語和直接賓語)。例如:
Mother is preparing us a meal. = Mother is preparing a meal for us.
母親正在為我們做飯。
The secretary has prepared the president a long report. = The secretary has prepared a long report for the president.
秘書已為董事長准備好了一份長篇報告稿。
3. prepare + 動詞不定式短語。例如:
They are busy preparing to go on vacation.
他們正忙著准備去度假。
After the discussion they prepared to write an article to air their views.
經過討論,他們准備寫一篇文章來提出自己的看法。
4. prepare + for (或 against )引起的短語。例如:
The students are busy preparing for the mid-term examination.
學生們正忙於為期中考試作準備。
The peasants are preparing against the drought.
農民們正在為抗乾旱作準備。
注意: prepare against 用於為災害、意外不幸或不愉快事件作準備。
二 . prepare 作「使(人)作好准備;叫(人)作準備」解時,可用於下述場合:
1. prepare + sb + for sth .例如:
He was preparing himself for the marathon race then.
他當時正在為參加馬拉松比賽而作準備。
The teacher prepared his students for the college entrance examination.
老師指導他的學生為大學入學考試作準備。
2. prepare + sb + 動詞不定式短語。例如:
He prepared himself to take out a license for a driver.
他為取得汽車駕駛執照作了准備。
The nurse is preparing the child to go to hospital.
保姆在為孩子住院作準備。
三 . 過去分詞 prepared 用於系表結構,意思為「為……做好准備;打算」,常用於以下句式:
1. be prepared + for (或 against )引起的短語。例如:
They were prepared for the worst.
他們已准備好應付最壞的情況。
I knew there were problems, but I was not prepared for this.
我知道有些問題,但卻未防範這一點!
2. be prepared + 不定式短語。例如:
They were prepared to go to work in the countryside.
他們准備到農村去工作。
I am not prepared to listen to all your weak excuses.
我不願聽你那些不成借口的借口。
They were prepared to be friendly.
他們打算和好。
⑥ PHP 使用 Mysqli 的 prepare 語句有什麼好處
好處:
(1)解析查詢只有一次
(2)執行一些查詢優化步驟只有一次
(3)通過二進制協議發送參數比送他們為ASCII文本更有效
比如DATE,對於准備之後,發送日期只用3個位元組;如果沒有準備,日期必須以字元串的形式發送,需要資料庫方再解析,這樣需要發送10個位元組。
(4)只有參數(不是整個查詢文本)需要為每個執行要發送
(5)的MySQL直接存儲parameteres到伺服器上的緩沖區
(6)安全性也有幫助,就沒有必要逃避或引用值。
壞處:
(1)本地到一個連接,以便另一個連接不能再使用
(2)不能使用MySQL查詢緩存(5.1版本之前)
(3)不總是更有效,如果你使用它只有一次
(4)存儲函數中不能使用(存儲過程是可以的)
(5)有可能會導致「泄漏」如果你忘記釋放它
⑦ 高手們看過來吧,卸載office2010時出現下列情況怎麼辦啊請各位高手看下列代碼:
你在控制面板中自己不能卸載嗎?
如果控制面板有卸載選項,但是卸載不了,可按照下面方法手工卸載。
1、在桌面找到要刪除的程序,右擊選屬性/查找目標,在打開的頁面里有這個程序的路徑,如果桌面沒有圖標可以通過搜索查找試試,另外軟體一般默認存儲在C:\Program Files裡面找找,到程序軟體的文件夾整體刪除,如果系統拒絕,請你開機按F8進入安全模式中將軟體的文件夾整體刪除(或下載Unlocker小軟體刪除)。然後,開始/運行輸入regedit回車打開注冊表編輯器,選編輯/查找,你卸載軟體的英文名,找到軟體的鍵值項後刪除(多次查找反復刪除干凈)。
2、添加或刪除程序在注冊表的位置,運行輸入regedit回車,打開注冊表定位[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\windows\CurrentVersion\Uninstall]子鍵,在該子鍵下,可跟據已卸載的應用程序軟體圖標,刪除相對應的軟體圖標和鍵值,重新啟動電腦即可。
⑧ Android surfaceview實現顯示畫面但不立即播放功能!
package com.zsch.forestinventory.activity.left_activity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.zsch.androidlib.activity.BaseActivity;
import com.zsch.androidlib.ui.ZoomableImageView;
import com.zsch.androidlib.view.LVCircularRing;
import com.zsch.forestinventory.R;
import java.io.IOException;
/**
* 查看單張照片
*/
public class ShowVideoActivity extends BaseActivity implements View.OnClickListener, MediaController.MediaPlayerControl, MediaPlayer.OnBufferingUpdateListener, SurfaceHolder.Callback {
private ImageButton ibBack;
private Uri uri;
private MediaPlayer mediaPlayer;
private MediaController controller; //視頻播放控制器
private int bufferPercentage = 0;
@Override
protected void initVariables() {
uri = getIntent().getData();
if (uri == null)
finish();
}
@Override
protected void initView(Bundle savedInstanceState) {
setContentView(R.layout.activity_show_video);
mediaPlayer = new MediaPlayer();
controller = new MediaController(this);
//媒體控制器將創建一個具有默認設置的控制項,並把它們放到一個窗口裡漂浮在你的應用程序上。具體來說,這些控制項會漂浮在通過setAnchorView()指定的視圖上
//設置這個控制器綁定(anchor/錨)到一個視圖上。例如可以是一個VideoView對象,或者是你的activity的主視圖。
controller.setAnchorView(findViewById(R.id.root_ll));
if (savedInstanceState == null) {
// Bundle類型的數據與Map類型的數據相似,都是以key-value的形式存儲數據的。實際上,savedInstanceState也就是保存Activity的狀態的
//onsaveInstanceState方法是用來保存Activity的狀態的。當一個Activity在生命周期結束前,會調用該方法保存狀態
// 用來保存狀態信息的Bundle會同時傳給兩個method,即onRestoreInstanceState() and onCreate().
uri = getIntent().getData();
} else {
uri = savedInstanceState.getParcelable("uri");
}
if (uri == null) {
Toast.makeText(this, "無視頻展示", Toast.LENGTH_SHORT).show();
finish();
return;
}
SurfaceView videoSuf = (SurfaceView) findViewById(R.id.controll_surfaceView);
ibBack=(ImageButton) findViewById(R.id.ibBack);
ibBack.setOnClickListener(this);
videoSuf.setZOrderOnTop(false);//true時 會置頂到window的最上層,那麼會遮擋其它view ...
videoSuf.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
videoSuf.getHolder().addCallback(this); //只要繼承SurfaceView類並實現SurfaceHolder.Callback介面就可以實現一個自定義的SurfaceView了, 然後有surfaceCreated,surfaceChanged,surfaceDestroyed 等三種方法
// videoSuf.getHolder().setKeepScreenOn(true); //屏幕總是打開
//videoSuf.setFixedSize(320, 220);//顯示的解析度,不設置為視頻默認
}
@Override
protected void loadData() {
}
@Override
protected void onResume() {
super.onResume();
// try {
// mediaPlayer.setDataSource(uri.getPath()); //播放存儲設備的資源文件
// mediaPlayer.setOnBufferingUpdateListener(this); //監聽事件,網路流媒體的緩沖監聽。這個方法與上個介面中的方法int getBufferPercentage()進行結合使用
// //mediaPlayer.prepare();
// controller.setMediaPlayer(this);
// controller.setEnabled(true); //設置按鈕可點擊 false 設置為不可點擊
// }catch (IOException e){
// e.printStackTrace();
// }
}
@Override
protected void onPause() {
super.onPause();
if (mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (null != mediaPlayer){
mediaPlayer.release();
mediaPlayer = null;
}
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.ibBack:
onBackPressed();
break;
}
}
@Override
public void onBackPressed() {
// if (mediaPlayer.isPlaying()){
// mediaPlayer.stop();
// }
// if (null != mediaPlayer){
// mediaPlayer.release();
// mediaPlayer = null;
// }
finish(); // finish();//在Activity中執行this.finish()方法之後,執行如下過程: onPause(),onStop(),onDestory(),
}
@Override
public boolean onTouchEvent(MotionEvent event) { //實現這個方法來處理觸摸屏幕引發的事件。
controller.show();
return super.onTouchEvent(event);
}
@Override
public void onPointerCaptureChanged(boolean hasCapture) {
}
//MediaPlayerControl
@Override
public void onBufferingUpdate(MediaPlayer mediaPlayer, int i) {
bufferPercentage = i;
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) { //這步很重要 surfaceCreated創建時使用 //必須在surface創建後才能初始化MediaPlayer,否則不會顯示圖像
try {
mediaPlayer.setDataSource(uri.getPath()); //播放存儲設備的資源文件
mediaPlayer.setOnBufferingUpdateListener(this); //監聽事件,網路流媒體的緩沖監聽。這個方法與上個介面中的方法int getBufferPercentage()進行結合使用
//mediaPlayer.prepare();
controller.setMediaPlayer(this);
controller.setEnabled(true); //設置按鈕可點擊 false 設置為不可點擊
}catch (IOException e){
e.printStackTrace();
}
//設置顯示視頻顯示在SurfaceView上
mediaPlayer.setDisplay(surfaceHolder);
// prepare方法是將資源同步緩存到內存中,一般載入本地較小的資源可以用這個,如果是較大的資源或者網路資源建議使用prepareAsync方法,非同步載入.
// 但如果想讓資源啟動,即start()起來,因為在非同步中,如果不設置監聽直接start的話,是拿不到這個資源,如果讓線程睡眠一段時間,則可以取得資源,
mediaPlayer.prepareAsync(); //准備 為非同步載入
controller.show(); //顯示控制器
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
//這里的 start()和pause() 指的是 media的拍攝過程中的 步驟
@Override
public void start() {
if (null != mediaPlayer){
mediaPlayer.start();
}
}
@Override
public void pause() {
if (null != mediaPlayer){
mediaPlayer.pause();
}
}
@Override
public int getDuration() {
return mediaPlayer.getDuration();
}
@Override
public int getCurrentPosition() { //獲得 視頻播放的位置 為了暫停後 繼續播放
return mediaPlayer.getCurrentPosition();
}
@Override
public void seekTo(int i) {
mediaPlayer.seekTo(i);
}
@Override
public boolean isPlaying() {
if (mediaPlayer.isPlaying()){
return true;
}
return false;
}
@Override
public int getBufferPercentage() {
return bufferPercentage;
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return 0;
}
}
⑨ hql 查詢中的!=是什麼意思
?表示參數保留位,將來用於替換為真正的參數
= 是等於後面的參數
!= 是不等於後面的參數