三年中文在线观看免费大全_三年大片免费高清哔哩哔哩_三年在线观看免费大全哔哩_三年大全免费大片三年大片_三年在线观看免费大全_三年大片观看免费大全哔哩哔哩_三年中文在线观看免费高清第4版_三年中文免费视频大全_三年大片大全免费观看大全_三年大片在线观看哔哩哔哩_三年在线观看中文免费观看_三年成都中文在线观看免费版

android學習(xí)二十四(網絡編程的(de)最佳實踐) -×©× 新聞資訊 - 雲南(nán)小(xiǎo)程序開(kāi∏♥™∞)發|雲南(nán)軟件(jiàn)開(kāi)發|雲南(náβπ↕n)網站(zhàn)建設-雲南維串信息科技有限公司

159-8711-8523

雲南(nán)網建設/小(xiǎo)程序開(kāi)發/'↑γ軟件(jiàn)開(kāi)發

知(zhī)識

不(bù)管是(shì)網站(zhàn),軟件(jiàn≤β)還(hái)是(shì)小(xiǎo)程序,都(dōu)要(≈∑♥♦yào)直接或間(jiān)接能(néng)為(wèi)您産生(shēng'‍↕)價值,我們在追求其視(shì)覺表現(xiàn)的(de)同時(shí),更側重于功π ≤能(néng)的(de)便捷,營銷的(de)便利,運營的(de)高(gāo)效,讓€₹網站(zhàn)成為(wèi)營銷工(gōng)具,讓軟件(jiàn)能(néng)Ω>←β切實提升企業(yè)內(nèi)部管理(lǐ)水(shuǐ)平和(hé)效率。優秀的(de)↔'€程序為(wèi)後期升級提供便捷的(de)支持!

android學習(xí)二十四(網絡編程的(de)最佳實踐)

發表時(shí)間(jiān):2021-1-10

發布人(rén):葵宇科(kē)技(jì)

浏覽次數(shù):61


 前面的(de)博客已經講解了(le)HttpURLCo§♦​nnection和(hé)HttpClient的(de)用(yòng)法,知(zhī₩♣Ω™)道(dào)了(le)如(rú)何發起HTTP請(§÷♥qǐng)求,以及解析服務器(qì)返回
 的(de)數(shù)據。但(dàn)是(shα♦♣↓ì)可(kě)能(néng)你(nǐ)發現(xiàn)了(le),因為(wèi)一(yī) ∞®個(gè)應用(yòng)程序很(hěn)多(duō)地(dì)方都(dōu↔ε)可(kě)能(néng)使用(yòng)網絡功能(néng),而發送∞↓HTTP請(qǐng)求的(de)代碼基本相(xiàng)同,如(rú)∏♠✔↕果每次我們都(dōu)去(qù)編寫一(yī)遍發送HTTP請(qǐλ♣ng)求的(de)代碼,這(zhè)顯然不(bù)太好☆¶✘(hǎo)。
    通(tōng)常情況下(xià)我們都(dōu)應該将這(z↔¥βhè)些(xiē)通(tōng)用(yòng)的(de)網絡操作(<§↔zuò)提取到(dào)一(yī)個(gè)公共的(de)類裡(lǐ),并提供一(yī)個(•¥↑÷gè)靜(jìng)态方法,當想要(yào)發起網絡請(qǐng)求的(de)時≤≤∞✘(shí)候隻需簡單地(dì)調用(yòng)一(yī)下(xià)這(zhè)個(gè)方∏≠法即可(kě)。比如(rú)下(xià)面的(de) ♦ 寫法:
package com.jack.networktest;

♦σimport java.io.BufferedReader;
impo☆™rt java.io.InputStream;
importλ φ java.io.InputStreamReader;
import jav±€∑♥a.net.HttpURLConnection;
imp£♣✘ort java.net.URL;

public class HttpUtil {
ε ‌
	public static String send¶≠÷↓HttpRequest(String addressσ'₩){
		HttpURLConnection connection=null;
		try{
¥♦©			URL url=new URL(address);
			connectio"≠∏n = (HttpURLConnection) url.o<©γpenConnection();
			connection.setRequestMetho®'d("GET");
			con↔σ®nection.setConnectTimeout(8000);
			connectα£✔ion.setReadTimeout(8000);
			connection.setDoInpu≈≠t(true);
			connection.setDoOutput(true <);
			InputStream in=connection.getInputStream();©✘αε
			BufferedReader reader=new BufferedReade §₩βr(new InputStreamReader(in));
			StringBuilde γ"♥r response=new StringBuilder();  ÷
			String line;
			while((line=reader.readLine( ≤))!=null){
				response.append(line);
™×✔			}
			return response.toString();
	 $♥§	}catch(Exception e){
			e.printStackTrace(® ≤≈);
			return e.getMessage();
		}f"§Ωinally{
			if(connection!=null){
				connect∏&↕ion.disconnect();
			}
		}
	}
}

以後每當要(yào)發起一(yī)條HTTP請(qǐng)求的(de)時(shí)候就¶λ≤(jiù)可(kě)以這(zhè)樣寫:
  String address="htt©↕p://www.baidu.com";
  String response=HttpUtil→♠δ★.sendHttpRequest(address);



         >γ♥;在獲取到(dào)服務器(qì)響應的(de)數(shù)據後我們就(jiù)™₹↓可(kě)以對(duì)它進行(xíng)解析和(hé)處理(lǐ)了(le)。但(dàn)是ΩΩπ<(shì)需要(yào)注意,網絡請(qǐng)求通(tōng)常都(dōσ¥ ↓u)是(shì)屬于耗時(shí)操作(zuò),而 sendHttpRequest±πλ₽方法的(de)內(nèi)部并沒有(yǒu)開(kāi☆&≤)啓線程,這(zhè)樣就(jiù)可(kě)能(néng)導緻在 δ♦£調用(yòng)sendHttpRequest方法的(de)時(shí)候使得₹✘∑(de)主線程阻塞住。你(nǐ)可(kě)能(néng)說(shuō)σ↔₽,在sendHttpRequest方法內(nèi)部開(kāi)啓一(yī)個(gè)線程不(bù♣♠)就(jiù)解決了(le)阻塞這(zhè)個(gè)問(wèn)題了(le)↓∑嘛。其實沒那(nà)麽簡單,因為(wèi)如(rú)果我¶φ們在sendHttpRequest方法中開(kāi)啓Ωγ了(le)一(yī)個(gè)線程來(lái)發起HTTP請(qǐng)求,那(nà)麽服務∞¶器(qì)響應的(de)數(shù)據是(shì)無法進行(xíng)返回的(d≤←e),所有(yǒu)的(de)耗時(shí)邏輯都(dōu)是(σδ€∑shì)在子(zǐ)線程裡(lǐ)進行(xíng)的(®♦®₩de),sendHttpRequest方法會(huì)在服務器(qì)還(hái)來(lái)得♣ (de)及響應的(de)時(shí)候就(jiù)執行↔α (xíng)結束了(le),當然也(yě)就(jiù)無法返回響應的(de)數(shù$<)據了(le)。
  那(nà)麽這(zhè)種情況該如(rú)何解決?其實解決方法‍≤可(kě)以使用(yòng)java的(de)回調機(jī)制(zhì),下(xià)面就←¥↔∑(jiù)讓我們來(lái)學習(xí)一(yī)下(xià)回 ≥ •調機(jī)制(zhì)到(dào)底如(rú)何使用(yòng)的(de)。
  首先需要(yào)定義一(yī)個(gè×επ )接口,比如(rú)将它命名成HttpCallbackListen♠←er,代碼如(rú)下(xià)所示:
  public interfac HttpCallbackα≈βListener{
  void onFinish(Stringα←¶₩ response);
  void onError(Exception e);
  }
  可(kě)以看(kàn)到(dào),我們在接口中定義了§±™×(le)兩個(gè)方法,onFinish(Stri £∏"ng response)方法表示當服務器(qì)成功響應我們請(qǐng)求
  的(de)時(shí)候調用(yòng₩✘®π),onError(Exception e)表示當進行(xíng)網絡操作(zuò)出現(xià✔δn)錯(cuò)誤的(de)時(shí)候調用(yòng)。≠±≠®這(zhè)兩個(gè)方法都(dōu)帶有(yǒu)參數(shù),
  onFinish(String response)方法中的(de•₩φ)參數(shù)代表著(zhe)服務器(qì)返回的(de)數(s≈÷£₩hù)據,而onError(Exception e)方法
  中的(de)參數(shù)記錄著(zhe)錯(cuò)誤的§×(de)詳細信息。

       接著(zhe)修改HttpUtil ​‌&中的(de)代碼:
import java.io.BufferedReader;
im ♥βport java.io.InputStream;
import java.io.≥✔InputStreamReader;
import java.net☆✘$ .HttpURLConnection;
import java.net.URL;
₩↑±
public class HttpUtil {

	public stati±↑<c void sendHttpRequest(final Str↓γing address,
			final HttpCallbackListener list ↓≤ener){
		new Thread(new Runn®♦able(){

			
			@Override
			public void run¥Ω↕©() {
				// TODO Auto-generated m∑<ethod stub
				HttpURLConnection connectδ✔ion=null;
				try{
					URL url=new URL(a®ε'ddress);
					connection = (HttpURLConne÷≥£πction) url.openConnection();
					connection.setR∏‍₹ equestMethod("GET");
					connection×→φ.setConnectTimeout(8000);
		φ€$π			connection.setReadTimeout(8000);
					c"→onnection.setDoInput(true);
	∏©₩€				connection.setDoOutput(true)>$‍;
					InputStream in=connection.getInputStream()β£;
					BufferedReader reader=new BufferedRe πδ∏ader(new InputStreamReader(in));
φ÷					StringBuilder response=new Strγ‍§λingBuilder();
					String line;
				•π	while((line=reader.readLine())!=null){
						res•♥ponse.append(line);
					}
					if(listener!=nu&₩‌ll){
						//回調onFinish()方法
						liste↓®ner.onFinish(response.toString());
					}
				}ca✔≠‌tch(Exception e){
					if(listeneφ≈r!=null){
						//回調onError()方法
						liste♦₩≤ner.onError(e);
					}
					
		≥φ↔✔		}finally{
					if(connection!=null){
						coβδ nnection.disconnect();
					}
					}
			}
				})∏☆.start();
		
		
	}
}



我們首先給sendHttpRequest方法添加了(le)一(yδπεī)個(gè)HttpCallbackListener參數(shù),并在方法的(d‌§e)內(nèi)部開(kāi)啓了(le)一(yī)♥≠個(gè)子(zǐ)線程,然後
在子(zǐ)線程裡(lǐ)去(qù)執行(xíng)具體(tǐ)的(de)網絡≠©δ≠操作(zuò)。注意子(zǐ)線程中是(shì)無法通(tōng)過return語句來(±λ ∏lái)返回數(shù)據的(de),因此這(zhè)裡(lǐ)我們将服務器(qì)響應的( £de)數(shù)據傳入了(le)HttpCallback★≥≠Listener的(de)onFinish()方法中,如(rú)∏γ果出現(xiàn)了(le)異常就(jiù)将異常原因傳入到(dào)onEr α↔ror()方法中。
  現(xiàn)在sendHttpRequest方法接收兩個(gè)參數(shù)了÷ ​±(le),因此我們在調用(yòng)它的(de)時(s± ∞☆hí)候還(hái)需要(yào)将HttpCallbackListener的(de)實例傳入
  如(rú)下(xià)所示:
HttpUtil.sendHttpRequest(addre¶>εφss,new HttpCallbackListener(){
   public v♣λoid onFinish(String response){
  ✘¥ Ω //在這(zhè)裡(lǐ)根據返回內(nèi)容執行(xíng)具體(tδ"ǐ)的(de)邏輯
   }
   
   public voi₩★♦♠d onError(Exception e){
    ÷€☆  //在這(zhè)裡(lǐ)對(duì)異常進行(xíng)處理♦≥(lǐ)
   }
   
  });

這(zhè)樣的(de)話(huà),當服務器(qì)成功響應的(de)時♠σ(shí)候我們就(jiù)可(kě)以在onFin♠↕✘≥ish方法裡(lǐ)對(duì)響應數(shù)據進行(xíng)處理(lǐ↑∏↔≥)了(le),類似地(dì),如(rú)果出現(xiàn)了¥≤₽ (le)異常,就(jiù)可(kě)以在onErrorδ'∏↑方法裡(lǐ)對(duì)異常情況進行(xíng)處理(lǐ)。如(rú)此一(yī)來(l×★σ×ái),我們就(jiù)巧妙的(de)利用(yòng)回調機(jī)制'☆<(zhì)将響應數(shù)據成功返回給調用(yòng)方了(le)。α<×₩
  另外(wài)需要(yào)注意的(de)是(shì),✘↓₹¶onFinish方法和(hé)onError方法最終還(hái)是(&$ shì)在子(zǐ)線程中運行(xíng)的(de),因此'♣我們不(bù)可(kě)以在這(zhè)裡(lǐ)執行(xíngσ☆)任何的(de)
  UI操作(zuò),如(rú)果需要(yào)根據返回的(de)結• €÷果來(lái)更新UI,則仍然要(yào)使用(yòng)異步♣λβ 消息處理(lǐ)機(jī)制(zhì)。

http://blog.csdn.net/j903829182/arti'α♥cle/details/42521437

相(xiàng)關案例查看(kàn)更多(duō)

相(xiàng)關閱讀(dú)

三年中文在线观看免费大全_三年大片免费高清哔哩哔哩_三年在线观看免费大全哔哩_三年大全免费大片三年大片_三年在线观看免费大全_三年大片观看免费大全哔哩哔哩_三年中文在线观看免费高清第4版_三年中文免费视频大全_三年大片大全免费观看大全_三年大片在线观看哔哩哔哩_三年在线观看中文免费观看_三年成都中文在线观看免费版