知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們在追求其視覺表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏壧峁┍憬莸闹С郑?
Android筆記
發(fā)表時(shí)間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):69
基于TCP協(xié)定的收集通信
應(yīng)用URL拜訪收集資本
應(yīng)用HTTP拜訪收集
應(yīng)用WebView視圖顯示網(wǎng)頁
基于TCP協(xié)定的收集通信
TCP/IP通信協(xié)定是一種靠得住的收集協(xié)定,它在通信的兩端各建立一個(gè)Socket,通信的兩端之間形成收集虛擬鏈路。Java對基于TCP協(xié)定的收集通信供給了優(yōu)勝的封裝,Java應(yīng)用Socket對象來代表兩端的通信接口,并經(jīng)由過程Socket產(chǎn)生IO流來進(jìn)行收集通信。
1.1 應(yīng)用ServerSocket創(chuàng)建TCP辦事器端
Java中能接收其他通信實(shí)體連接請求的類是ServerSocket, ServerSocket對象用于監(jiān)聽來自客戶端的Socket連接,如不雅沒有連接,它將一向處于等待狀況。 ServerSocket包含一個(gè)監(jiān)聽來自客戶端連接請求的辦法。
Socket accept():如不雅接收到一個(gè)客戶端Socket的連接請求,該辦法將返回一個(gè)與客戶端Socket對應(yīng)的Socket;不然該辦法將一向處于等待狀況,線程也被壅塞。
為了創(chuàng)建ServerSocket對象,ServerSocket類供給了如下幾個(gè)構(gòu)造器:
ServerSocket(int port):用指定的端口port來創(chuàng)建一個(gè)ServerSocket。該端口應(yīng)當(dāng)是有一個(gè)有效的端口整數(shù)值:0~65535。
ServerSocket(int port,int backlog):增長一個(gè)用來改變連接隊(duì)列長度的參數(shù)backlog。
ServerSocket(int port,int backlog,InetAddress localAddr):在機(jī)械存在多個(gè) IP地址的情況下,許可經(jīng)由過程localAddr這個(gè)參數(shù)來指定將ServerSocket綁定到指定的IP地址。
當(dāng)ServerSocket應(yīng)用完畢,應(yīng)應(yīng)用ServerSocket的close()辦法來封閉該ServerSocket。
平日情況下,辦事器不該該只接收一個(gè)客戶端請求,而應(yīng)當(dāng)賡續(xù)地接收來自客戶端的所有請求,所以Java法度榜樣平日會(huì)經(jīng)由過程輪回,賡續(xù)地調(diào)用ServerSocket的accept()辦法。如下代碼片段所示:
[img]http://img.blog.csdn.net/20150105144328451
1.2 應(yīng)用Socket進(jìn)行通信
客戶端平日可應(yīng)用Socket的構(gòu)造器來連接到指定辦事器,Socket平日可應(yīng)用如下兩個(gè)構(gòu)造器:
Socket(InetAddress/String remoteAddress, int port):創(chuàng)建連接到指定長途主機(jī)、長途端口的Socket。
Socket(InetAddress/String remoteAddress, int port, InetAddress localAddr, int localPort):創(chuàng)建連接到指定長途主機(jī)、長途端口的Socket,并指定本地IP地址和本地端標(biāo)語。
膳綾擎兩個(gè)構(gòu)造器中指定長途主機(jī)時(shí)既可應(yīng)用InetAddress來指定,也可直接應(yīng)用String對象來指定,但法度榜樣平日應(yīng)用String對象(如127.0.0.1)來指定長途IP。
[img]http://img.blog.csdn.net/20150105144304359
以上代碼將會(huì)連接到指定辦事器,讓辦事器端的ServerSocket的accept()辦法向下履行。
當(dāng)客戶端、辦事器端產(chǎn)生了對應(yīng)的Socket之后,法度榜樣無須再區(qū)分辦事器、客戶端,而是經(jīng)由過程各自的Socket進(jìn)行通信,Socket供給如下兩個(gè)辦法來獲取輸入流和輸出流:
InputStream getInputStream():返回該Socket對象對應(yīng)的輸入流,讓法度榜樣經(jīng)由過程該輸入流大年夜Socket中掏出數(shù)據(jù)。
OutputStream getOutputStream():返回該Socket對象對應(yīng)的輸出流,讓法度榜樣經(jīng)由過程該輸出流向Socket中輸出數(shù)據(jù)。
例:簡單收集通信:
辦事器端法度榜樣代碼:
SimpleServer.java
public class SimpleServer { public static void main(String[] args) throws IOException { //創(chuàng)建一個(gè)ServerSocket,用于監(jiān)聽客戶端Socket的連接請求 ServerSocket ss = new ServerSocket(30000); //采取輪回賡續(xù)接收來自客戶端的請求 while (true) { //每當(dāng)接收到客戶端Socket的請求,辦事器端也對應(yīng)產(chǎn)生一個(gè)Socket Socket s = ss.accept(); OutputStream os = s.getOutputStream(); os.write("您好,您收到了辦事器的新年祝福!\n" .getBytes("utf-8")); //封閉輸出流,封閉Socket os.close(); s.close(); } } }
客戶端法度榜樣:
SimpleClient.java
public class SimpleClient extends Activity { EditText show; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); show = (EditText) findViewById(R.id.show); //封閉輸入流、socket try { Socket socket = new Socket("127.0.0.1" , 30000); //將Socket對應(yīng)的輸入流包裝成BufferedReader BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream())); //進(jìn)行通俗IO操作 String line = br.readLine(); show.setText("來自辦事器的數(shù)據(jù):" + line); br.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
<!-- 授權(quán)拜訪互聯(lián)網(wǎng)--> <uses-permission android:name="android.permission.INTERNET"/>
總結(jié)Socket通信,創(chuàng)建辦事器步調(diào):
指定端話柄例化一個(gè)ServerSocket
調(diào)用ServerSocket的accept()等待連接
獲取位于該底層Socket的流以進(jìn)行讀寫操作
對數(shù)據(jù)封裝成流
對Socket進(jìn)行讀寫
封閉打開的流
總結(jié)Socket通信,創(chuàng)建客戶端的步調(diào):
經(jīng)由過程IP地址和端話柄例化Socket,請求連接辦事器
獲取Socket上的流以進(jìn)行讀寫
把流包裝進(jìn)BufferedReader/PrintWriter的實(shí)例
對Socket進(jìn)行讀寫
封閉打開的流
1.3 多線程
實(shí)際應(yīng)用中的客戶端則可能須要和辦事器端保持長時(shí)光通信,即辦事器須要賡續(xù)地攫取客戶端數(shù)據(jù),并向客戶端寫入數(shù)據(jù);客戶端也須要賡續(xù)地攫取辦事器數(shù)據(jù),并向辦事器寫入數(shù)據(jù)。
辦事器應(yīng)當(dāng)為每個(gè)Socket零丁啟動(dòng)一條線程,每條線程負(fù)責(zé)與一個(gè)客戶端進(jìn)行通信。
客戶端攫取辦事器數(shù)據(jù)的線程同樣會(huì)被壅塞,所以體系應(yīng)當(dāng)零丁啟動(dòng)一條線程,該線程專門負(fù)責(zé)攫取辦事器數(shù)據(jù)。
例:C/S聊天室法度榜樣:
辦事端法度榜樣:
MyServer.java
public class MyServer { //定義保存所有Socket的ArrayList public static ArrayList<Socket> socketList = new ArrayList<Socket>(); public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(30000); while(true) { //此行代碼會(huì)壅塞,將一向等待別人的連接 Socket s = ss.accept(); socketList.add(s); //每當(dāng)客戶端連接后啟動(dòng)一條ServerThread線程為該客戶端辦事 new Thread(new ServerThread(s)).start(); } } }
ServerThread.java
//負(fù)糶ウ理每個(gè)線程通信的線程類 public class ServerThread implements Runnable { //定義當(dāng)前哨程所處理的Socket Socket s = null; //該線程所處理的Socket所對應(yīng)的輸入流 BufferedReader br = null; public ServerThread(Socket s) throws IOException { this.s = s; //初始化該Socket對應(yīng)的輸入流 br = new BufferedReader(new InputStreamReader( s.getInputStream() , "utf-8")); //② } public void run() { try { String content = null; //采取輪回賡續(xù)大年夜Socket中攫取客戶端發(fā)送過來的數(shù)據(jù) while ((content = readFromClient()) != null) { //遍歷socketList中的每個(gè)Socket, //將讀到的內(nèi)容向每個(gè)Socket發(fā)送一次 for (Socket s : MyServer.socketList) { OutputStream os = s.getOutputStream(); os.write((content + "\n").getBytes("utf-8")); } } } catch (IOException e) { e.printStackTrace(); } } //定義攫取客戶端數(shù)據(jù)的辦法 private String readFromClient() { try { return br.readLine(); } //如不雅捕獲到異常,注解該Socket對應(yīng)的客戶端已經(jīng)封閉 catch (IOException e) { //刪除該Socket。 MyServer.socketList.remove(s); //① } return null; } }
客戶端法度榜樣:
MultiThreadClient.java
public class MultiThreadClient extends Activity { // 定義界面上的兩個(gè)文本框 EditText input, show; // 定義界面上的一個(gè)按鈕 Button send; OutputStream os; Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); input = (EditText) findViewById(R.id.input); send = (Button) findViewById(R.id.send); show = (EditText) findViewById(R.id.show); Socket s; handler = new Handler() { @Override public void handleMessage(Message msg) { // 如不雅消息來自于子線程 if (msg.what == 0x123) { // 將攫取的內(nèi)容追加顯示在文本框中 show.append("\n" + msg.obj.toString()); } } }; try { s = new Socket("127.0.0.1", 30000); // 客戶端啟動(dòng)ClientThread線程賡續(xù)攫取來自辦事器的數(shù)據(jù) new Thread(new ClientThread(s, handler)).start(); // ① os = s.getOutputStream(); } catch (Exception e) { e.printStackTrace(); } send.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { // 將用戶在文本框內(nèi)輸入的內(nèi)容寫入收集 os.write((input.getText().toString() + "\r\n") .getBytes("utf-8")); // 清空input文本框 input.setText(""); } catch (Exception e) { e.printStackTrace(); } } }); } }
客戶端線程:
ClientThread.java
public class ClientThread implements Runnable { //該線程負(fù)糶ウ理的Socket private Socket s; private Handler handler; //該線程所處理的Socket所對應(yīng)的輸入流 BufferedReader br = null; public ClientThread(Socket s , Handler handler) throws IOException { this.s = s; this.handler = handler; br = new BufferedReader( new InputStreamReader(s.getInputStream())); } public void run() { try { String content = null; //賡續(xù)攫取Socket輸入流中的內(nèi)容。 while ((content = br.readLine()) != null) { // 每當(dāng)讀到來自辦事器的數(shù)據(jù)之后,發(fā)送消息通知法度榜樣界面顯示該數(shù)據(jù) Message msg = new Message(); msg.what = 0x123; msg.obj = content; handler.sendMessage(msg); } } catch (Exception e) { e.printStackTrace(); } } }
應(yīng)用URL拜訪收集資本
URL對象代表同一資本定位器,它是指向互聯(lián)網(wǎng)”資本”的指針,資本可所以簡單的文件或目次,也可所以對更復(fù)雜的對象的引用,URL可由協(xié)定名、主機(jī)、端口和資本構(gòu)成 。
URL類供給了多個(gè)構(gòu)造器用于創(chuàng)建URL對象,一旦獲得了URL對象之后,可聲調(diào)用如下常用辦法來拜訪該URL對應(yīng)的資本。
String getFile():獲取此URL的資本名
String getHost():獲取此URL的主機(jī)名
String getPath():獲取些URL的路徑部分
int getPort():獲取此URL的端標(biāo)語
String getProtocol():獲取此URL的協(xié)定名稱
String getQuery():獲取此URL的萌芽字符串部分
URLConnection openConnection():URL所引用長途對象連接
InputStream openStream():打開與些URL的連接,并返回一個(gè)用于攫取該URL資本的InputStream。
例:應(yīng)用URL攫取收集資本:
URLTest.java
public class URLTest extends Activity { ImageView show; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); show = (ImageView) findViewById(R.id.show); // 定義一個(gè)URL對象 try { URL url = new URL("http://www.xxx.com/photo.png"); // 打開該URL對應(yīng)的資本的輸入流 InputStream is = url.openStream(); // 大年夜InputStream中解析出圖片 Bitmap bitmap = BitmapFactory.decodeStream(is); // 應(yīng)用ImageView顯示該圖片 show.setImageBitmap(bitmap); is.close(); // 再次打開URL對應(yīng)的資本的輸入流 is = url.openStream(); // 打開手機(jī)文件對應(yīng)的輸出流 OutputStream os = openFileOutput("crazyit.png" , MODE_WORLD_READABLE); byte[] buff = new byte[1024]; int 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(); } } }
2.1 應(yīng)用URLConnection提交請求
平日創(chuàng)建一個(gè)和URL的連接,并發(fā)送請求。攫取此URL引用的資本須要如下幾個(gè)步調(diào) :
經(jīng)由過程調(diào)用Url對象openConnection()辦法創(chuàng)建URLConnection對象。
設(shè)置URLConnection的參數(shù)和通俗請求屬性。
如不雅只是發(fā)送get方法請求,應(yīng)用Connect辦法建立和長途資本之間的實(shí)際連接即可;如不雅須要發(fā)送post方法的請求須要獲取URlConnection實(shí)例對應(yīng)的輸出流來發(fā)送請求參數(shù)。
長途資本變?yōu)榭捎?,法度榜樣可以拜訪長途資本的頭字段或經(jīng)由過程輸入流攫取長途資本的數(shù)據(jù)。
在建立和長途資本的實(shí)際連接之前,可以經(jīng)由過程如下辦法來設(shè)置請求頭字段。
setAllowUserInteraction:設(shè)置該URLConnection的allowUserInteraction請求頭字段的值。
setDoInput:設(shè)置該URLConnection的doInput請求頭字段的值。
setDoOutput:設(shè)置該URLConnection的doOutput請求頭字段的值。
setIfModifiedSince:設(shè)置該URLConnection的ifModifiedSince請求頭字段的值。
setUseCaches:設(shè)置該URLConnection的useCaches請求頭字段的值
還可以應(yīng)用如下辦法來設(shè)置或增長通用頭字段。
setRequestProperty(String key,String value):設(shè)置該URLConnection的key請求頭字段的值為value。
addRequestProperty(String key,String value):為該URLConnection的key請求頭字段增長value值。
當(dāng)長途資本可用時(shí),法度榜樣可以應(yīng)用以下辦法用于拜訪頭字段和內(nèi)容。
Object getContent():獲取該URLConnection的內(nèi)容
String getHeaderField(String name):獲取指定響應(yīng)頭字段的值
getInputStream():返回該URLConnection對應(yīng)的輸入流,用于獲取URLConnection響應(yīng)的內(nèi)容。
getOutputStream():返回該URLConnection對應(yīng)的輸出流,用于向URLConnection發(fā)送請求參數(shù)。
例:向Web站點(diǎn)發(fā)送GET、POST請求:
GetPostMain.java
public class GetPostMain extends Activity { Button get , post; EditText show; @Override public 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.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String response = GetPostUtil .sendGet("http://127.0.0.1:8080/abc/a.jsp" , null); show.setText(response); } }); post.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String response = GetPostUtil .sendPost("http://127.0.0.1:8080/abc/login.jsp" , "name=xxx&pass=123"); show.setText(response); } }); } }
GetPostUtil.java
public class GetPostUtil { /** * 向指定URL發(fā)送GET辦法的請求 * * @param url * 發(fā)送請求的URL * @param params * 請求參數(shù),請求參數(shù)應(yīng)當(dāng)是name1=value1&name2=value2的情勢。 * @return URL所代表長途資本的響應(yīng) */ public static String sendGet(String url, String params) { String result = ""; BufferedReader in = null; try { String urlName = url + "?" + params; URL realUrl = new URL(urlName); // 打開和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)"); // 建立實(shí)際的連接 conn.connect(); // 獲取所有響應(yīng)頭字段 Map<String, List<String>> map = conn.getHeaderFields(); // 遍歷所有的響應(yīng)頭字段 for (String key : map.keySet()) { System.out.println(key + "--->" + 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(); } // 應(yīng)用finally塊來封閉輸入流 finally { try { if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; } /** * 向指定URL發(fā)送POST辦法的請求 * * @param url * 發(fā)送請求的URL * @param params * 請求參數(shù),請求參數(shù)應(yīng)當(dāng)是name1=value1&name2=value2的情勢。 * @return URL所代表長途資本的響應(yīng) */ public static String sendPost(String url, String params) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL 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ā)送POST請求必須設(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 = in.readLine()) != null) { result += "\n" + line; } } catch (Exception e) { System.out.println("發(fā)送POST請求出現(xiàn)異常!" + e); e.printStackTrace(); } // 應(yīng)用finally塊來封閉輸出流、輸入流 finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; } }
應(yīng)用HTTP拜訪收集
3.1 應(yīng)用HttpURLConnection
URLConnection還有一個(gè)子類:HttpURLConnection,可以用于向指定網(wǎng)站發(fā)送GET請求、POST請求。它在URLConnection的基本上供給了如下辦法:
int getResponseCode():獲取辦事器的響應(yīng)代碼
String getResponseMessage():獲取辦事器的響應(yīng)信息
String getRequestMethod():獲取發(fā)送請求的辦法
Void setRequestMethod(String method):設(shè)置發(fā)送請求的辦法
例:多線程下載:
為了實(shí)現(xiàn)多線程,法度榜樣可按如下步調(diào)進(jìn)行:
創(chuàng)建URL對象
獲取指定URL對象所指象的資本大年夜?。ㄓ蒰etContentLength()辦法實(shí)現(xiàn)),此處用到了HttpURLConnection類。
在本地磁盤上創(chuàng)建一個(gè)與收集資本雷同大年夜小的空文件
計(jì)算每條線程應(yīng)當(dāng)下載收集資本的哪個(gè)部分
依次創(chuàng)建、啟動(dòng)多條線程來下載收集資本的指定部分。
3.2 應(yīng)用Apache HttpClient
HttpClient是一個(gè)加強(qiáng)版的HttpURLConnection,它是一個(gè)簡單的客戶端(并不是瀏覽器),可以發(fā)送HTTP請求,接收HTTP響應(yīng),以及治理HTTP連接。但不會(huì)緩存辦事器的響應(yīng),不克不及履行HTML頁面中嵌入的JavaScript代碼,也不會(huì)對頁面內(nèi)容進(jìn)行任何解析、處理。
Android已經(jīng)成功地集成了HttpClient,可以直接在Android應(yīng)用中應(yīng)用HttpClient來拜訪提交請求、接收響應(yīng)。應(yīng)用HttpClient的步調(diào)如下:
創(chuàng)建HttpClient對象
如不雅須要發(fā)送GET請求,創(chuàng)建HttpGet對象,如不雅須要發(fā)送POST請求,創(chuàng)建HttpPost對象。
如不雅須要發(fā)送請求參數(shù),可調(diào)用HttpGet、HttpPost合營的setParams(HttpParams params)辦法來添加請求參數(shù)。
調(diào)用HttpClient對象的execute(HttpUriRequest request)發(fā)送請求,該辦法返回一個(gè)HttpResponse。
調(diào)用HttpResponse的getAllHeader()、getHeaders(String name)等辦法可獲取辦事器的響應(yīng)頭;調(diào)用HttpResponse的getEntity()辦法可獲取HttpEntity對象,該對象包含了辦事器的響應(yīng)內(nèi)容。法度榜樣可經(jīng)由過程該對象獲取辦事器的響應(yīng)內(nèi)容。
例:HttpClient拜訪被保護(hù)的資本:
HttpClientTest.java
public class HttpClientTest extends Activity { Button get; Button login; EditText response; HttpClient httpClient; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.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() { @Override public void onClick(View v) { // 創(chuàng)建一個(gè)HttpGet對象 HttpGet get = new HttpGet( "http://127.0.0.1:8080/foo/secret.jsp"); try { // 發(fā)送GET請求 HttpResponse httpResponse = httpClient.execute(get); HttpEntity entity = httpResponse.getEntity(); if (entity != null) { // 攫取辦事器響應(yīng) BufferedReader br = new BufferedReader( new InputStreamReader(entity.getContent())); String line = null; response.setText(""); while ((line = br.readLine()) != null) { // 應(yīng)用response文本框顯示辦事器響應(yīng) response.append(line + "\n"); } } } catch (Exception e) { e.printStackTrace(); } } }); login.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { final View loginDialog = getLayoutInflater().inflate( R.layout.login, null); new AlertDialog.Builder(HttpClientTest.this) .setTitle("登錄體系") .setView(loginDialog) .setPositiveButton("登錄", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String name = ((EditText) loginDialog .findViewById(R.id.name)).getText() .toString(); String pass = ((EditText) loginDialog .findViewById(R.id.pass)).getText() .toString(); HttpPost post = new HttpPost( "http://127.0.0.1:8080/foo/login.jsp"); // 如不雅傳遞參數(shù)個(gè)數(shù)比較多的話可以對傳遞的參數(shù)進(jìn)行封裝 List<NameValuePair> params = new ArrayList<NameValuePair>(); params .add(new BasicNameValuePair("name", name)); params .add(new BasicNameValuePair("pass", pass)); try { // 設(shè)置請求參數(shù) post.setEntity(new UrlEncodedFormEntity( params, HTTP.UTF_8)); // 發(fā)送POST請求 HttpResponse response = httpClient .execute(post); // 如不雅辦事器成功地返回響應(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(); } } }).setNegativeButton("撤消", null).show(); } }); } }
應(yīng)用WebView視圖顯示網(wǎng)頁
4.1 應(yīng)用WebView瀏覽網(wǎng)頁
WebView的用法與通俗的ImageView組件的用法基本相似,它供給了大年夜量辦法來履行瀏覽器操作,例如如下常用辦法。
void goBack():撤退撤退
void goForward():進(jìn)步
void loadUrl(String url):加載指定的URL對應(yīng)的網(wǎng)頁
boolean zoomIn():放大年夜網(wǎng)頁
boolean zoomOut():縮小網(wǎng)頁
例:迷你瀏覽器:
MiniBrowser.java
public class MiniBrowser extends Activity { EditText url; WebView show; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 獲取頁面中文本框、WebView組件 url = (EditText) findViewById(R.id.url); show = (WebView) findViewById(R.id.show); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_SEARCH) { String urlStr = url.getText().toString(); // 加載、并顯示urlStr對應(yīng)的網(wǎng)頁 show.loadUrl(urlStr); return true; } return false; } }
Main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/url" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <!-- 顯示頁面的WebView組件 --> <WebView android:id="@+id/show" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
4.2 應(yīng)用WebView加載HTML代碼
應(yīng)用WebView可以對HTML字符串進(jìn)行解析、當(dāng)成HTML頁面來顯示。 WebView供給了一個(gè)loadDataWithBaseURL(String baseUrl,String data,String mimeType,String encoding,String historyUrl)辦法,該辦法是對loadData(String data, data,String mimeType,String encoding)辦法的加強(qiáng),它不會(huì)產(chǎn)生亂碼。
例:應(yīng)用WebView加載HTML:
在設(shè)備文件中加上拜訪收集的權(quán)限
[img]http://img.blog.csdn.net/20150105144337671
ViewHtml.java
public class ViewHtml extends Activity { WebView show; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 獲取法度榜樣中的WebView組件 show = (WebView) findViewById(R.id.show); StringBuilder sb = new StringBuilder(); // 拼接一段HTML代碼 sb.append("<html>"); sb.append("<head>"); sb.append("<title> 迎接您 </title>"); sb.append("</head>"); sb.append("<body>"); sb.append("<h2> 迎接您拜訪<a href=http://www.sjsjw.com/"http://http://blog.csdn.net/">" + "CSDN"); sb.append("