版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1. 使用URL訪問網(wǎng)絡(luò)資源1) URL構(gòu)造函數(shù)可以指定資源地址,如:URL url = new URL(/a.jpg);2) String getFile() 獲取URL資源名String getHost() 獲取URL 主機名 String getPath() 獲取URL路徑部分URLConnection openConnection ()返回連接對象InputString openStream() 打開URL鏈接,返回讀取該URL資源的流1.1 使用URL讀取網(wǎng)絡(luò)資源(P489,URLTest)public class URLTest extends ActivityImageView
2、show;Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);show = (ImageView) findViewById(R.id.show);/ 定義一個URL對象try URL url = new URL(/attachments/”+ month_1008/20100812_7763e970f822325bfb019ELQVym8tW3A.png);/ 打開該URL對應(yīng)的資源的輸入流InputStr
3、eam is = url.openStream();/ 從InputStream中解析出圖片Bitmap bitmap = BitmapFactory.decodeStream(is);/ 使用ImageView顯示該圖片show.setImageBitmap(bitmap);is.close();/ 再次打開URL對應(yīng)的資源的輸入流is = url.openStream();/ 打開手機文件對應(yīng)的輸出流OutputStream os = openFileOutput(crazyit.png, MODE_WORLD_READABLE);byte buff = new byte1024; int
4、 hasRead = 0;/ 將URL對應(yīng)的資源下載到本地while(hasRead = is.read(buff) 0) os.write(buff, 0 , hasRead); is.close();os.close();catch (Exception e)e.printStackTrace();1.2 使用URLConnection提交請求(P492,GetPostTest)URL 的 openConnection()返回 URLConnection對象,以后可通過設(shè)置該對象的參數(shù)和請求屬性,可以從遠程讀取數(shù)據(jù),也可以向遠程發(fā)送數(shù)據(jù)請求種類: Web 上最常用的兩種 Http 請求就是
5、 Get 請求和 Post 請求。GET 從服務(wù)器上獲取數(shù)據(jù),這是最常見的請求類型。簡單的參數(shù)通過URL地址發(fā)送每次在瀏覽器中輸入 URL 打開頁面時,就是向服務(wù)器發(fā)送一個 Get 請求。 Get 請求的參數(shù)是用問號追加到 URL 結(jié)尾,后面跟著用連接起來的名稱值對。比如網(wǎng)址 /viewthread.php?tid=87813&id2=kk ,其中 tid ,id2為參數(shù)名, 87813,kk 為參數(shù)的值。通過 URL 可以看到中傳遞的參數(shù)。因此,相比于 Post ,它是不安全的POST可以傳遞復(fù)雜的數(shù)據(jù),如表單。Post 的使用場合多是在表單提交的地方,因為和 Get 相比, Post 可以
6、發(fā)送更多的數(shù)據(jù) Post 是通過 HTTP Post 機制,將表單內(nèi)各個字段與其內(nèi)容放置在 HTML Header 內(nèi)一起傳送到 ACTION 屬性所指的 URL 地址。 和 Get 相比, Post 的內(nèi)容是不會在 URL 中顯現(xiàn)出來的,這多少是安全一些的。1.2 使用URLConnection提交請求(P492,GetPostTest)GetPostUtil.javapublic class GetPostUtil/* * 向指定URL發(fā)送GET方法的請求 * param url * 發(fā)送請求的URL * param params * 請求參數(shù),請求參數(shù)應(yīng)該是name1=value1&na
7、me2=value2的形式。 * return URL所代表遠程資源的響應(yīng) */public static String sendGet(String url, String params)String result = ;BufferedReader in = null;tryString urlName = url + ? + params;URL realUrl = new URL(urlName);/ 打開和URL之間的連接URLConnection conn = realUrl.openConnection();/ 設(shè)置通用的請求屬性conn.setRequestProperty(a
8、ccept, */*);conn.setRequestProperty(connection, Keep-Alive);conn.setRequestProperty(user-agent,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1);/ 建立實際的連接conn.connect();/ 獲取所有響應(yīng)頭字段MapString, List map = conn.getHeaderFields();/ 遍歷所有的響應(yīng)頭字段for (String key : map.keySet() System.out.println(key + +
9、 map.get(key);/ 定義BufferedReader輸入流來讀取URL的響應(yīng)in = new BufferedReader( new InputStreamReader(conn.getInputStream();String line;while (line = in.readLine() != null) result += n + line;catch (Exception e)System.out.println(發(fā)送GET請求出現(xiàn)異常! + e);e.printStackTrace();/ 使用finally塊來關(guān)閉輸入流finallytryif (in != null)
10、in.close();catch (IOException ex)ex.printStackTrace();return result;/* * 向指定URL發(fā)送POST方法的請求 * param url * 發(fā)送請求的URL * param params * 請求參數(shù),請求參數(shù)應(yīng)該是name1=value1&name2=value2的形式。 * return URL所代表遠程資源的響應(yīng) */public static String sendPost(String url, String params)PrintWriter out = null;BufferedReader in = nul
11、l;String result = ;tryURL realUrl = new URL(url);/ 打開和URL之間的連接URLConnection conn = realUrl.openConnection();/ 設(shè)置通用的請求屬性conn.setRequestProperty(accept, */*);conn.setRequestProperty(connection, Keep-Alive);conn.setRequestProperty(user-agent,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1);/ 發(fā)送P
12、OST請求必須設(shè)置如下兩行conn.setDoOutput(true);conn.setDoInput(true);/ 獲取URLConnection對象對應(yīng)的輸出流out = new PrintWriter(conn.getOutputStream();/ 發(fā)送請求參數(shù)out.print(params);/ flush輸出流的緩沖out.flush();/ 定義BufferedReader輸入流來讀取URL的響應(yīng)in = new BufferedReader(new InputStreamReader(conn.getInputStream();String line;while (line
13、 = in.readLine() != null)result += n + line;catch (Exception e)System.out.println(發(fā)送POST請求出現(xiàn)異常! + e);e.printStackTrace();/ 使用finally塊來關(guān)閉輸出流、輸入流finallytryif (out != null)out.close();if (in != null)in.close();catch (IOException ex)ex.printStackTrace();return result;GetPostMain.javapublic class GetPost
14、Main extends ActivityButton get , post;EditText show;Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);get = (Button) findViewById(R.id.get);post = (Button) findViewById(R.id.post);show = (EditText)findViewById(R.id.show);get.setO
15、nClickListener(new OnClickListener()Overridepublic void onClick(View v)String response = GetPostUtil.sendGet(/dict/search,q=please&qs=n&form=CM&pq=please&sc=0-0&sp=-1&sk=);show.setText(response);/查必應(yīng)詞典);/在必應(yīng)詞典查單詞 please 的URL是:/ /dict/search? q=please&qs=n&form=CM&pq=please&sc=0-0&sp=-1&sk=post.setOn
16、ClickListener(new OnClickListener()Overridepublic void onClick(View v)String response = GetPostUtil.sendPost(/login,user_id1=guowei&password1=123);/登錄POJshow.setText(response););User ID:Password:RegisterString response = GetPostUtil.sendPost(/login,user_id1=guowei&password1=123);Post錯誤密碼后:String res
17、ponse = GetPostUtil.sendPost(/login,user_id1=guowei&password1=XXXX);Post正確密碼后:2 使用HTTP訪問網(wǎng)絡(luò)URLConnection的派生類 HttpURLConnection 也可以用來發(fā)送POST請求和GET請求2.1 多線程下載(P496,MultiThreadDown)創(chuàng)建URL對象,用getContentLength()獲取資源大小,然后在本地磁盤創(chuàng)建同樣大小的空文件,然后計算每條線程應(yīng)該下載文件哪部分,再創(chuàng)建多個線程2.1 多線程下載(P496,MultiThreadDown)DownUtil.java 與A
18、ndroid無關(guān)public class DownUtil/ 定義下載資源的路徑private String path;/ 指定所下載的文件的保存位置private String targetFile;/ 定義需要使用多少線程下載資源private int threadNum;/ 定義下載的線程對象private DownloadThread threads;/ 定義下載的文件的總大小private int fileSize;public DownUtil(String path, String targetFile, int threadNum)this.path = path;this.t
19、hreadNum = threadNum;/ 初始化threads數(shù)組threads = new DownloadThreadthreadNum;this.targetFile = targetFile;public void download() throws ExceptionURL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5 * 1000);conn.setRequestMethod(GET);conn.setR
20、equestProperty(Accept,image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*);conn.setR
21、equestProperty(Accept-Language, zh-CN);conn.setRequestProperty(Charset, UTF-8);conn.setRequestProperty(User-Agent,Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729);conn.setRequestP
22、roperty(Connection, Keep-Alive);/ 得到文件大小fileSize = conn.getContentLength();conn.disconnect();int currentPartSize = fileSize / threadNum + 1;RandomAccessFile file = new RandomAccessFile(targetFile, rw);/ 設(shè)置本地文件的大小file.setLength(fileSize);file.close();for (int i = 0; i threadNum; i+)/ 計算每條線程的下載的開始位置in
23、t startPos = i * currentPartSize;/ 每個線程使用一個RandomAccessFile進行下載RandomAccessFile currentPart = new RandomAccessFile(targetFile,rw);/ 定位該線程的下載位置currentPart.seek(startPos);/ 創(chuàng)建下載線程 threadsi = new DownloadThread(startPos, currentPartSize,currentPart);/ 啟動下載線程threadsi.start();/ 獲取下載的完成百分比public double ge
24、tCompleteRate()/ 統(tǒng)計多條線程已經(jīng)下載的總大小int sumSize = 0;for (int i = 0; i threadNum; i+)sumSize += threadsi.length;/ 返回已經(jīng)完成的百分比return sumSize * 1.0 / fileSize;private class DownloadThread extends Thread/ 當(dāng)前線程的下載位置private int startPos;/ 定義當(dāng)前線程負責(zé)下載的文件大小private int currentPartSize;/ 當(dāng)前線程需要下載的文件塊private RandomAc
25、cessFile currentPart;/ 定義已經(jīng)該線程已下載的字節(jié)數(shù)public int length;public DownloadThread(int startPos, int currentPartSize,RandomAccessFile currentPart)this.startPos = startPos;this.currentPartSize = currentPartSize;this.currentPart = currentPart;Overridepublic void run()tryURL url = new URL(path);HttpURLConnec
26、tion conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5 * 1000);conn.setRequestMethod(GET);conn.setRequestProperty(Accept,image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap,
27、 application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*);conn.setRequestProperty(Accept-Language, zh-CN);conn.setRequestProperty(Charset, UTF-8);InputStream inStream = conn.getInputStream();/ 跳過startPos個字節(jié),表明該線程只下載自己負責(zé)哪部分文件。inStream.skip(this.s
28、tartPos);byte buffer = new byte1024;int hasRead = 0;/ 讀取網(wǎng)絡(luò)數(shù)據(jù),并寫入本地文件while (length = 100) timer.cancel();, 0, 100););2.3 使用Apache Http Client (P501,HttpClientTest)為了處理session,Cookie等問題,可以使用 HttpClient,簡單的Http客戶端,但不能執(zhí)行網(wǎng)頁的 javascript,也不能解析網(wǎng)頁Session: 在服務(wù)器端存放的用戶的信息,比如登錄以后,登錄網(wǎng)頁會在服務(wù)器端存放 session“username” =
29、 “xxxx”,此后在同一瀏覽器內(nèi)訪問的各個頁面,啟動時 都可以在服務(wù)器端通過關(guān)鍵字”username”獲取session中存放的用戶名Cookie:瀏覽器保存在客戶端的臨時信息2.3 使用Apache Http Client (P501,HttpClientTest)使用HttpClient: 創(chuàng)建 HttpGet對象發(fā)送Get請求創(chuàng)建 HttpPost對象發(fā)送Post請求HttpPost,HttpGet都有setParams可以設(shè)置請求參數(shù)HttpClient的excute(HttpUriRequest )可以發(fā)送請求,返回HttpResponse對象HttpResponse對象的 get
30、Entity可以獲取 HttpEntity對象,內(nèi)含服務(wù)器響應(yīng)內(nèi)容2.3 .1 HttpClient訪問被保護資源 (P501,HttpClientTest)public class HttpClientTest extends ActivityButton get;Button login;EditText response;HttpClient httpClient;Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout
31、.main);/ 創(chuàng)建DefaultHttpClient對象httpClient = new DefaultHttpClient();get = (Button) findViewById(R.id.get);login = (Button) findViewById(R.id.login);response = (EditText) findViewById(R.id.response);get.setOnClickListener(new OnClickListener()Overridepublic void onClick(View v)/ 創(chuàng)建一個HttpGet對象HttpGet g
32、et = new HttpGet(8:8888/foo/secret.jsp);try/ 發(fā)送GET請求HttpResponse httpResponse = httpClient.execute(get);HttpEntity entity = httpResponse.getEntity();if (entity != null)/ 讀取服務(wù)器響應(yīng)BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent();String line = null;response.setText();whil
33、e (line = br.readLine() != null)/ 使用response文本框顯示服務(wù)器響應(yīng)response.append(line + n);catch (Exception e)e.printStackTrace(););login.setOnClickListener(new OnClickListener()Overridepublic void onClick(View v)final View loginDialog = getLayoutInflater().inflate(R.layout.login, null);new AlertDialog.Builder
34、(HttpClientTest.this).setTitle(登錄系統(tǒng)).setView(loginDialog).setPositiveButton(登錄,new DialogInterface.OnClickListener()Overridepublic void onClick(DialogInterface dialog,int which)String name = (EditText) loginDialog.findViewById(R.).getText().toString();String pass = (EditText) loginDialog.findViewByI
35、d(R.id.pass).getText().toString();HttpPost post = new HttpPost(8:8888/foo/login.jsp);/ 如果傳遞參數(shù)個數(shù)比較多的話可以對傳遞的參數(shù)進行封裝List params = new ArrayList();params.add(new BasicNameValuePair(name, name);params.add(new BasicNameValuePair(pass, pass);try/ 設(shè)置請求參數(shù)post.setEntity(new UrlEncodedFormEntity(params, HTTP.UT
36、F_8);/ 發(fā)送POST請求HttpResponse response = httpClient.execute(post);/ 如果服務(wù)器成功地返回響應(yīng)if (response.getStatusLine().getStatusCode() = 200)String msg = EntityUtils.toString(response.getEntity();/ 提示登錄成功Toast.makeText(HttpClientTest.this,msg, 5000).show();catch (Exception e)e.printStackTrace();).setNegativeBut
37、ton(取消, null).show(););3 使用 WebView瀏覽網(wǎng)頁WebView就是一個瀏覽器實現(xiàn),內(nèi)核是 WebKit引擎常用方法:goBack()goForward()loadUrl(String Url)boolean zoomIn() 放大boolean zoomOut() 縮小3.1 使用 WebView瀏覽網(wǎng)頁(P506, MiniBrowser)public class MiniBrowser extends ActivityEditText url;WebView show;Overridepublic void onCreate(Bundle savedInsta
38、nceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);/ 獲取頁面中文本框、WebView組件url = (EditText) findViewById(R.id.url);show = (WebView) findViewById(R.id.show);Overridepublic boolean onKeyDown(int keyCode, KeyEvent event)if (keyCode = KeyEvent.KEYCODE_SEARCH)String urlStr = url.getTex
39、t().toString();/ 加載、并顯示urlStr對應(yīng)的網(wǎng)頁show.loadUrl(urlStr);return true;return false;3.2 使用 WebView 加載html代碼(P508, ViewHtml)WebView 提供loadData(String data,String mimeType,string encoding) 方法用于加載并顯示HTML文檔。但中文處理不好loadDataWithBaseUrl(String baseUrl,String data,String mineType,String encoding, String history
40、Uri) 支持中文data:代表html文檔的字符串mineType : “text/html”Encoding: 字符集,可以為 “GBK”,”UTF-8”3.2 使用 WebView 加載html代碼(P508, ViewHtml)public class ViewHtml extends ActivityWebView show;Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);/ 獲取程序中的Web
41、View組件show = (WebView) findViewById(R.id.show);StringBuilder sb = new StringBuilder();/ 拼接一段HTML代碼sb.append();sb.append();sb.append( 歡迎您 );sb.append();sb.append();sb.append( 歡迎您訪問+ 瘋狂Java聯(lián)盟);sb.append();sb.append();/ 使用簡單的loadData方法會導(dǎo)致亂碼,可能是Android API的Bug/show.loadData(sb.toString() , “text/html” , “utf-8”); /”GBK”就亂碼了/ 加載、并顯示HTML代碼show.loadDataWithBaseURL(nul
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版住宅小區(qū)物業(yè)合同轉(zhuǎn)讓及社區(qū)養(yǎng)老服務(wù)協(xié)議3篇
- 2025年度二零二五林業(yè)苗木培育及采購合作協(xié)議4篇
- 二零二五版租賃房屋租賃合同網(wǎng)絡(luò)安全保障協(xié)議3篇
- 二零二五年頂樓住宅買賣合同協(xié)議6篇
- 2025版綠色生態(tài)園區(qū)綠化養(yǎng)護工程承包合同3篇
- 二零二五年度智慧停車設(shè)施運營服務(wù)合同4篇
- 個人二手家具買賣合同2024年度交易規(guī)范3篇
- 棗莊建筑公司2025年度碎石采購合同2篇
- 二零二五版二手房裝修改造合同范本
- 2024酒店蔬菜供貨合同
- GB/T 45120-2024道路車輛48 V供電電壓電氣要求及試驗
- 財務(wù)報銷流程培訓(xùn)課程
- 24年追覓在線測評28題及答案
- 春節(jié)慰問困難職工方案春節(jié)慰問困難職工活動
- 2024年全國職業(yè)院校技能大賽高職組(藥學(xué)技能賽項)考試題庫(含答案)
- 2024至2030年中國氫氧化鈣行業(yè)市場全景調(diào)查及發(fā)展趨勢分析報告
- 魚菜共生課件
- 《陸上風(fēng)電場工程概算定額》NBT 31010-2019
- 初中物理八年級下冊《動能和勢能》教學(xué)課件
- 心肌梗死診療指南
- 原油脫硫技術(shù)
評論
0/150
提交評論