AndroidStudio項(xiàng)目開發(fā)教程-從基礎(chǔ)入門到樂享開發(fā) 課件 第七章 網(wǎng)絡(luò)編程_第1頁
AndroidStudio項(xiàng)目開發(fā)教程-從基礎(chǔ)入門到樂享開發(fā) 課件 第七章 網(wǎng)絡(luò)編程_第2頁
AndroidStudio項(xiàng)目開發(fā)教程-從基礎(chǔ)入門到樂享開發(fā) 課件 第七章 網(wǎng)絡(luò)編程_第3頁
AndroidStudio項(xiàng)目開發(fā)教程-從基礎(chǔ)入門到樂享開發(fā) 課件 第七章 網(wǎng)絡(luò)編程_第4頁
AndroidStudio項(xiàng)目開發(fā)教程-從基礎(chǔ)入門到樂享開發(fā) 課件 第七章 網(wǎng)絡(luò)編程_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第七章網(wǎng)絡(luò)編程安卓·入門與開發(fā)目錄7.1 通過Http訪問網(wǎng)絡(luò)7.2 解析JSON格式數(shù)據(jù)7.3 網(wǎng)絡(luò)查詢手機(jī)號(hào)碼歸屬地7.1

通過Http訪問網(wǎng)絡(luò)在Android中可以使用HTTP協(xié)議訪問網(wǎng)絡(luò)。例如,在應(yīng)用商店下載軟件時(shí),或者刷新朋友圈時(shí),都需要通過HTTP協(xié)議訪問網(wǎng)絡(luò)。Http協(xié)議工作原理大致可以理解為:客戶端向服務(wù)器發(fā)出一條HTTP請(qǐng)求,服務(wù)器收到請(qǐng)求后返回一些數(shù)據(jù)給客戶端,客戶端對(duì)收到的數(shù)據(jù)進(jìn)行解析。在Android6.0以前,Android上發(fā)送Http請(qǐng)求主要有兩種方式:HttpURLConnection和HttpClient。其中HttpClient存在過多的API且難擴(kuò)展,于是在Android6.0系統(tǒng)中,HttpClient被完全移除,如需使用,需導(dǎo)入相應(yīng)文件。所以這里主要介紹HttpURLConnection的基本使用方法。HttpURLConnection類位于包中,用于發(fā)送HTTP請(qǐng)求和獲取HTTP響應(yīng)。由于該類是抽象類,不能直接實(shí)例化對(duì)象,則需要使用URL的openConnection方法來獲得。例如,要?jiǎng)?chuàng)建一個(gè)網(wǎng)站對(duì)應(yīng)的HttpURLConnection對(duì)象,可以使用下面的代碼:Url

url=

newURL(“/”);HttpURLConnectionurlConnection=(HttpURLConnection)url.openConnection();HttpURLConnection是URLConnection的一個(gè)子類,它在URLConnection的基礎(chǔ)上提供來如表7.1的方法,方便發(fā)送和響應(yīng)HTTP請(qǐng)求。創(chuàng)建HttpURLConnection對(duì)象后,就可以使用該對(duì)象發(fā)送HTTP請(qǐng)求了。表7.1HttpURLConnection常用的方法方法描述IntgetResponseCode()獲取服務(wù)器的響應(yīng)代碼StringgetResponseMessage()獲取服務(wù)器的響應(yīng)消息StringgetRequestMethod()獲取發(fā)送請(qǐng)求的方法voidsetRequestMethod(Stringmethod)設(shè)置發(fā)送請(qǐng)求的方法7.1通過Http訪問網(wǎng)絡(luò)7.1 通過Http訪問網(wǎng)絡(luò)目錄7.3 網(wǎng)絡(luò)查詢手機(jī)號(hào)碼歸屬地7.1 通過Http訪問網(wǎng)絡(luò)7.2 解析JSON格式數(shù)據(jù)7.1.1發(fā)送GET請(qǐng)求7.1.2發(fā)送POST請(qǐng)求7.1.1發(fā)送GET請(qǐng)求使用Activity類中的getPreferences方法獲取如果Activity僅需要一個(gè)SharedPreferences文件,則可以使用getPreferences方法獲取。因?yàn)橹挥幸粋€(gè)文件,所以不需要提供名稱。該方法的語法格式如下:getPreferences(intmode)其中,參數(shù)mode的取值同getSharedPreferences方法相同。使用HttpURLConnection對(duì)象發(fā)送請(qǐng)求時(shí),默認(rèn)發(fā)送的GET請(qǐng)求。因此發(fā)送GET請(qǐng)求比較簡(jiǎn)單,只需要在指定連接地址時(shí),先將要傳遞的參數(shù)通過“?參數(shù)名=參數(shù)值”的形式進(jìn)行傳遞(多個(gè)參數(shù)間可以使用英文半角的“&”符號(hào)分隔。),然后獲取輸入流中的數(shù)據(jù),并關(guān)閉連接即可。7.1通過Http訪問網(wǎng)絡(luò)7.1 通過Http訪問網(wǎng)絡(luò)7.1.1發(fā)送GET請(qǐng)求7.1.2發(fā)送POST請(qǐng)求7.1.2發(fā)送POST請(qǐng)求使用Activity類中的getPreferences方法獲取如果Activity僅需要一個(gè)SharedPreferences文件,則可以使用getPreferences方法獲取。因?yàn)橹挥幸粋€(gè)文件,所以不需要提供名稱。該方法的語法格式如下:getPreferences(intmode)其中,參數(shù)mode的取值同getSharedPreferences方法相同。

在Android中使用HttpURLConnection類發(fā)送請(qǐng)求時(shí),如果要發(fā)送POST請(qǐng)求,需要通過其setRequestMethod方法進(jìn)行指定。例如,創(chuàng)建一個(gè)HTTP連接,并為該連接指定請(qǐng)求的發(fā)送方式為POST,可以使用下面的代碼:Url

url=

newURL(“/”);HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();urlConn.setRequestMethod(“POST”);

發(fā)送POST請(qǐng)求要比發(fā)送GET請(qǐng)求復(fù)雜一些,它需要通過HttpURLConnection類及其父類URLConnection提供的方法設(shè)置相關(guān)內(nèi)容,常用的方法如表7.2所示:

表7.2發(fā)送POST請(qǐng)求時(shí)常用的方法方法描述setDoOutput(true);//需要輸出設(shè)置是否向連接中寫入數(shù)據(jù),true表示寫入數(shù)據(jù);否則表示不寫入數(shù)據(jù)。setDoInput(true);//需要輸入設(shè)置是否從連接中讀取數(shù)據(jù),true表示讀取數(shù)據(jù);否則表示不讀取數(shù)據(jù)。setUseCaches(false);//不允許緩存設(shè)置是否需要緩存數(shù)據(jù),true表示緩存數(shù)據(jù),否則表示禁用緩存。SetInstanceFollowRedirects(BooleanfollwRedirects)設(shè)置是否應(yīng)該自動(dòng)執(zhí)行HTTP重定向,true表示自動(dòng)執(zhí)行,否則不自動(dòng)執(zhí)行。setRequestProperty設(shè)置一般請(qǐng)求屬性,如需要設(shè)置內(nèi)容類型為表單數(shù)據(jù),代碼為setRequestProperty("Content-Type","Application/x-www-form-urlencoded");7.1通過Http訪問網(wǎng)絡(luò)7.1 通過Http訪問網(wǎng)絡(luò)7.2 解析JSON格式數(shù)據(jù)7.3 網(wǎng)絡(luò)查詢手機(jī)號(hào)碼歸屬地7.2 解析JSON格式數(shù)據(jù)目錄7.2.1JSON簡(jiǎn)介7.2.2解析JSON數(shù)據(jù)7.2解析JSON格式數(shù)據(jù)7.2.1JSON簡(jiǎn)介使用Activity類中的getPreferences方法獲取如果Activity僅需要一個(gè)SharedPreferences文件,則可以使用getPreferences方法獲取。因?yàn)橹挥幸粋€(gè)文件,所以不需要提供名稱。該方法的語法格式如下:getPreferences(intmode)其中,參數(shù)mode的取值同getSharedPreferences方法相同。JSON(JavaScriptObjectNotation)是一種輕量級(jí)的數(shù)據(jù)交換格式,用于數(shù)據(jù)的標(biāo)記、存儲(chǔ)和傳輸,其語法簡(jiǎn)潔,不僅易于閱讀和編寫,也易于機(jī)器的解析和生成。具有以下特點(diǎn):

輕量級(jí)的文本數(shù)據(jù)交換格式

獨(dú)立于語言和平臺(tái)

具有自我描述性

讀寫速度快,解析簡(jiǎn)單如下代碼所示,JSON通常由名稱/值、對(duì)象(名稱/值形式的映射)和數(shù)組等三種方式組成。JSON沒有變量或者其他控制,只用于數(shù)據(jù)傳輸。{"userInfo":{"user":[{"name":"zhangsan","year":"5"},{"name":"lisi","year":"4"}],"database":[{"name":"shop","size":"2"}]}}?“名稱/值”對(duì)無序、一個(gè)對(duì)象用“{}”包括,名稱和值間用“:”相隔,對(duì)象間用“,”隔開;"name":"zhangsan"?

對(duì)象一個(gè)JSON對(duì)象包括多個(gè)名稱/值對(duì),在花括號(hào)里書寫{"name":"zhangsan","year":"5"}?

數(shù)組數(shù)組以“[]”包括,數(shù)據(jù)的對(duì)象用逗號(hào)隔開[{"name":"zhangsan","year":"5"},{"name":"lisi","year":"4"}]7.2解析JSON格式數(shù)據(jù)7.2解析JSON格式數(shù)據(jù)7.2.1JSON簡(jiǎn)介7.2.2解析JSON數(shù)據(jù)使用Activity類中的getPreferences方法獲取如果Activity僅需要一個(gè)SharedPreferences文件,則可以使用getPreferences方法獲取。因?yàn)橹挥幸粋€(gè)文件,所以不需要提供名稱。該方法的語法格式如下:getPreferences(intmode)其中,參數(shù)mode的取值同getSharedPreferences方法相同。7.2.2解析JSON數(shù)據(jù)Android提供了用來解析JSON數(shù)據(jù)的JSONObject和JSONArray對(duì)象。其中JSONObject用于解析JSON對(duì)象;JSONArray用于解析數(shù)組。如需要解析的格式為:{"student":[{"id":1,"name":"小明","sex":"男","age":18,"height":175},{"id":2,"name":"小紅","sex":"女","age":19,"height":165},{"id":3,"name":"小強(qiáng)","sex":"男","age":20,"height":185}],"school":"第一中學(xué)"}解析的代碼如下所示:StringjsonStr=”…”//jsonStr為要解析的json字符串JSONObjectroot=newJSONObject(jsonStr.toString());//根據(jù)鍵名獲取鍵值信息System.out.println("root:"+root.getString("cat"));JSONArrayarray=root.getJSONArray("student");for(inti=0;i<array.length();i++){JSONObjectstud=array.getJSONObject(i);System.out.println("------------------");System.out.print("id="+stud.getInt("id")+","));System.out.print("name="+stud.getString("name")+","));System.out.print("sex="+stud.getString("sex")+","));System.out.print("age="+stud.getInt("age")+","));System.out.println("height="+stud.getInt("height")+","));}7.2解析JSON格式數(shù)據(jù)目錄7.1 通過Http訪問網(wǎng)絡(luò)7.2 解析JSON格式數(shù)據(jù)7.3 網(wǎng)絡(luò)查詢手機(jī)號(hào)碼歸屬地使用Activity類中的getPreferences方法獲取如果Activity僅需要一個(gè)SharedPreferences文件,則可以使用getPreferences方法獲取。因?yàn)橹挥幸粋€(gè)文件,所以不需要提供名稱。該方法的語法格式如下:getPreferences(intmode)其中,參數(shù)mode的取值同getSharedPreferences方法相同。7.3

網(wǎng)絡(luò)查詢手機(jī)號(hào)碼歸屬地本章首先介紹了如何通過HttpURLConnection訪問網(wǎng)絡(luò),在本項(xiàng)目中將實(shí)現(xiàn)通過HttpURLConnection訪問網(wǎng)絡(luò)來查詢手機(jī)歸屬地。

1、在fragment_mine.xml添加一個(gè)LinearLayout布局,往LinearLayout布局里添加兩個(gè)ImageView組件和一個(gè)TextView組件,用來顯示歸屬地查詢功能入口。<!--歸屬地查詢--><LinearLayoutstyle="@style/Mine_Item_Style"><ImageViewandroid:src="@drawable/mr_mine5"style="@style/Mine_Image_Style"/><TextViewandroid:text="歸屬地查詢"android:id="@+id/phone_query"style="@style/Mine_Text_Style"/><ImageViewandroid:src="@drawable/mr_right_to"style="@style/Mine_Image_Style"/></LinearLayout>7.3網(wǎng)絡(luò)查詢手機(jī)號(hào)碼歸屬地使用Activity類中的getPreferences方法獲取如果Activity僅需要一個(gè)SharedPreferences文件,則可以使用getPreferences方法獲取。因?yàn)橹挥幸粋€(gè)文件,所以不需要提供名稱。該方法的語法格式如下:getPreferences(intmode)其中,參數(shù)mode的取值同getSharedPreferences方法相同。2、在MineFragment類里聲明號(hào)碼歸屬地TextView組件phone_query,查詢結(jié)果集result以及查詢號(hào)碼phone。在initView方法里初始化組件phone_query,在setListener方法里添加點(diǎn)擊監(jiān)聽事件。privateTextViewphone_query;//號(hào)碼歸屬地查詢組件Stringresult="";//查詢結(jié)果Stringphone="";//查詢號(hào)碼/***初始化組件*@paramview*/@OverridepublicvoidinitView(Viewview){super.initView(view);login=(TextView)view.findViewById(R.id.custom_login);sp=getActivity().getSharedPreferences("UserData",Context.MODE_PRIVATE);phone_query=(TextView)view.findViewById(R.id.phone_query);}/***設(shè)置監(jiān)聽*/@OverridepublicvoidsetListener(){login.setOnClickListener(this);phone_query.setOnClickListener(this);}7.3網(wǎng)絡(luò)查詢手機(jī)號(hào)碼歸屬地使用Activity類中的getPreferences方法獲取如果Activity僅需要一個(gè)SharedPreferences文件,則可以使用getPreferences方法獲取。因?yàn)橹挥幸粋€(gè)文件,所以不需要提供名稱。該方法的語法格式如下:getPreferences(intmode)其中,參數(shù)mode的取值同getSharedPreferences方法相同。3、

在MineFragment類里初始化handle消息對(duì)象,用來提示查詢消息。privateHandlerhandler=newHandler(newHandler.Callback(){@OverridepublicbooleanhandleMessage(Messagemsg){switch(msg.what){case1://1請(qǐng)求成功try{//根據(jù)返回值格式,解析返回?cái)?shù)據(jù)JSONObjectjsonObject=newJSONObject(result);JSONObjectjsonObject2=newJSONObject(jsonObject.getString("response"));JSONObjectjsonObject3=newJSONObject(jsonObject2.getString(phone));//提示手機(jī)號(hào)碼歸屬地Toast.makeText(getActivity(),phone+":"+jsonObject3.getString("location"),Toast.LENGTH_SHORT).show();}catch(JSONExceptione){e.printStackTrace();Toast.makeText(getActivity(),"查詢失敗,請(qǐng)重新輸入有效號(hào)碼!",Toast.LENGTH_SHORT).show();}break;case0://1請(qǐng)求失敗Toast.makeText(getActivity(),"查詢失敗,請(qǐng)重新輸入有效號(hào)碼!",Toast.LENGTH_SHORT).show();break;}returnfalse;}});7.3網(wǎng)絡(luò)查詢手機(jī)號(hào)碼歸屬地使用Activity類中的getPreferences方法獲取如果Activity僅需要一個(gè)SharedPreferences文件,則可以使用getPreferences方法獲取。因?yàn)橹挥幸粋€(gè)文件,所以不需要提供名稱。該方法的語法格式如下:getPreferences(intmode)其中,參數(shù)mode的取值同getSharedPreferences方法相同。4、

在MineFragment類里新建getPhoneAddres方法用來請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)。/***請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù),獲取手機(jī)號(hào)碼歸屬地**@param*/publicvoidgetPhoneAddres(){//判斷手機(jī)號(hào)碼不為空,則請(qǐng)求網(wǎng)絡(luò)接口if(phone!=null&&!"".equals(phone)&&!"".equals(phone)&&phone.trim().length()>10){newThread(newRunnable(){@Overridepublicvoidrun(){try{//接口來源網(wǎng)絡(luò)URLurl=newURL("/dianhua_api/open/location?tel="+phone+"&t="+newDate().getTime());//新建HttpURLConnection對(duì)象HttpURLConnectionconnection=(HttpURLConnection)url.openConnection();//設(shè)置請(qǐng)求類型為getconnection.setRequestMethod("GET");//連接、請(qǐng)求時(shí)長connection.setConnectTimeout(5000);connection.setReadTimeout(5000);//設(shè)置http請(qǐng)求頭,防止亂碼}connection.setRequestProperty("Content-Type","Application/x-www-form-urlencoded");connection.setRequestProperty("charset","UTF-8");connection.setRequestProperty("Accept-Charset","utf-8");connection.setRequestProperty("contentType","utf-8");StringBuilders=newStringBuilder();//判斷是否請(qǐng)求成功if(connection.getResponseCode()==200){InputStreamReaderin=newInputStreamReader(connection.getInputStream());BufferedReaderbuffer=newBufferedReader(in);StringinputLine=null;//接收返回結(jié)果集while((inputLine=buffer.readLine())!=null){result+=inputLine;}//接收完消息,發(fā)送handler消息隊(duì)列,提示消息handler.obtainMessage(1,result).sendToTarget();}}catch(Exceptione){e.printStackTrace();}}}).start();}else{handler.obtainMessage(0,result).sendToTarget();}7.3網(wǎng)絡(luò)查詢手機(jī)號(hào)碼歸屬地使用Activity類中的getPreferences方法獲取如果Activity僅需要一個(gè)SharedPreferences文件,則可以使用getPreferences方法獲取。因?yàn)橹挥幸粋€(gè)文件,所以不需要提供名稱。該方法的語法格式如下:getPreferences(intmode)其中,參數(shù)mode的取值同getSharedPreferences方法相同。5、

在MineFragment類里新建showPhoneDialog方法,用來展示查詢手機(jī)號(hào)碼對(duì)話框。當(dāng)點(diǎn)擊“確定”按鈕,初始化手機(jī)號(hào)碼和返回結(jié)果,觸發(fā)getPhoneAddres方法請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)。/*@setIcon設(shè)置對(duì)話框圖標(biāo)*@setTitle設(shè)置對(duì)話框標(biāo)題*@setMessage設(shè)置對(duì)話框消息提示*setXXX方法返回Dialog對(duì)象,因此可以鏈?zhǔn)皆O(shè)置屬性*/privatevoidshowPhoneDialog(){finalAlertDialog.BuildernormalDialog=newAlertDialog.Builder(getActivity());finalEditTextet=newEditText(getActivity());normalDialog.setTitle("提示");normalDialog.setView(et);normalDialog.setMessage("請(qǐng)輸入查詢的手機(jī)號(hào)碼?");normalDialog.setPositiveButton("確定",newDialogInterface.OnClickListener(){//重寫“確定”按鈕點(diǎn)擊事件,點(diǎn)擊“確定”按鈕,根據(jù)號(hào)碼請(qǐng)求網(wǎng)絡(luò)接口,獲取號(hào)碼歸屬地@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){phone=et.getText().toString();result="";getPhoneAddres();}});normalDialog.setNegativeButton("關(guān)閉",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){//...To-doresult="";}});//顯示

normalDialog.show();}7.3網(wǎng)絡(luò)查詢手機(jī)號(hào)碼歸屬地使用Activity類中的getPreferences方法獲取如果Activity僅需要一個(gè)SharedPreferences文件,則可以使用getPreferences方法獲取。因?yàn)橹挥幸粋€(gè)文件,所以不需要提供名稱。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論