編輯:關於Android編程
1.概述
每個 HttpURLConnection 實例都可用於生成單個請求,但是其他實例可以透明地共享連接到 HTTP 服務器的基礎網絡。請求後在 HttpURLConnection 的 InputStream 或 OutputStream 上調用 close() 方法可以釋放與此實例關聯的網絡資源,但對共享的持久連接沒有任何影響。如果在調用 disconnect() 時持久連接空閒,則可能關閉基礎套接字。
2.在03_android入門_采用RelativeLayout實現登陸界面效果的案例繼續完善 效果如下:
點擊登陸按鈕 在服務器的控制台看到的結果<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"/uploadfile/Collfiles/20140523/2014052309114461.jpg" alt="\">
在點擊登陸按鈕之前,先通過eclipse中所帶的LogCat的工具,點擊
+號 彈出對話框
添加過濾的名稱和過濾的標識 點擊ok完成。
當點擊登陸按鈕之後即可在LogCat中看到執行的結果
當你輸入錯誤的用戶名和密碼的時候你可以看到如下效果
3.具體LoginActivity代碼的實現如下:(備注:在代碼中我添加了詳細的注釋請仔細閱讀)
package www.csdn.net.lesson03; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import android.app.Activity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class LoginActivity extends Activity { // 聲明控件對象 private EditText et_name, et_pass; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 設置顯示的視圖 setContentView(R.layout.activity_login); // 通過 findViewById(id)方法獲取用戶名的控件對象 et_name = (EditText) findViewById(R.id.et_name); // 通過 findViewById(id)方法獲取用戶密碼的控件對象 et_pass = (EditText) findViewById(R.id.et_pass); } /** * 通過android:onClick="login"指定的方法 , 要求這個方法中接受你點擊控件對象的參數v * * @param v */ public void login(View v) { // 獲取點擊控件的id int id = v.getId(); // 根據id進行判斷進行怎麼樣的處理 switch (id) { // 登陸事件的處理 case R.id.btn_login: // 獲取用戶名 final String userName = et_name.getText().toString(); // 獲取用戶密碼 final String userPass = et_pass.getText().toString(); if (TextUtils.isEmpty(userName) || TextUtils.isEmpty(userPass)) { Toast.makeText(this, "用戶名或者密碼不能為空", Toast.LENGTH_LONG).show(); } else { System.out .println("----------------------發送請求到服務器----------------------"); // 訪問網絡 (需要一個網絡的權限)// 訪問網絡(耗時的操作) 避免阻塞主線程(UI) 需要開啟新的子線程來處理 new Thread() { public void run() { // 調用loginByGet方法 loginByGet(userName, userPass); }; }.start(); } break; default: break; } } /** * 通過GET方式發送的請求 * * @param userName * @param userPass */ public void loginByGet(String userName, String userPass) { try { // 設置請求的地址 通過URLEncoder.encode(String s, String enc) // 使用指定的編碼機制將字符串轉換為 application/x-www-form-urlencoded 格式 String spec = "http://172.16.237.200:8080/video/login.do?username=" + URLEncoder.encode(userName, "UTF-8") + "&userpass=" + URLEncoder.encode(userPass, "UTF-8"); // 根據地址創建URL對象(網絡訪問的url) URL url = new URL(spec); // url.openConnection()打開網絡鏈接 HttpURLConnection urlConnection = (HttpURLConnection) url .openConnection(); urlConnection.setRequestMethod("GET");// 設置請求的方式 urlConnection.setReadTimeout(5000);// 設置超時的時間 urlConnection.setConnectTimeout(5000);// 設置鏈接超時的時間 // 設置請求的頭 urlConnection .setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"); // 獲取響應的狀態碼 404 200 505 302 if (urlConnection.getResponseCode() == 200) { // 獲取響應的輸入流對象 InputStream is = urlConnection.getInputStream(); // 創建字節輸出流對象 ByteArrayOutputStream os = new ByteArrayOutputStream(); // 定義讀取的長度 int len = 0; // 定義緩沖區 byte buffer[] = new byte[1024]; // 按照緩沖區的大小,循環讀取 while ((len = is.read(buffer)) != -1) { // 根據讀取的長度寫入到os對象中 os.write(buffer, 0, len); } // 釋放資源 is.close(); os.close(); // 返回字符串 String result = new String(os.toByteArray()); System.out.println("***************" + result + "******************"); } else { System.out.println("------------------鏈接失敗-----------------"); } } catch (Exception e) { e.printStackTrace(); } } }
package www.csdn.net.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取請求的參數值 String userName = request.getParameter("username"); String userPass = request.getParameter("userpass"); System.out.println("在沒有轉碼之前的"+userName+"---"+userPass); //GET方式的請求亂碼處理 userName = new String(userName.getBytes("ISO8859-1"),"UTF-8"); userPass = new String(userPass.getBytes("ISO8859-1"),"UTF-8"); System.out.println("在轉碼之後---"+userName+"---"+userPass); if("陳紅軍".equals(userName)&&"123".equals(userPass)){ //響應登陸成功的信息 response.getOutputStream().write("登陸成功".getBytes()); }else{ //相應登陸失敗的信息 response.getOutputStream().write("登陸失敗".getBytes()); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }對應的web.xml文件的配置是:
video LoginServlet LoginServlet www.csdn.net.servlet.LoginServlet LoginServlet /login.do
6.1.忘記在項目清單文件中添加訪問網絡的權限.
那麼程序運行的時候會出現如下bug
6.2.在按鈕點擊的事件處理中直接調用
loginByGet(userName, userPass);方法沒有在子線程中調用
loginByGet(userName, userPass);方法 就會出現如下bug
bug說明:在android4.0以後的版本中要想發送一個網絡的請求,就必須把這個請求寫在子線程中,否則就會出現如上的bug
6.3.在發送網路的請求的時候把請求的地址:
http://172.16.237.200:8080/video/login.do寫成了
http://localhost:8080/video/login.do或者http://127.0.0.1:8080/video/login.do
就會出現如下bug:
以上理解之後請同學們思考怎麼把返回的數據寫在下圖的位置尼
一.問題引入ListView控件:給Item綁定了點擊事件,卻點擊無效。二.解決方案ListView使用了自定義布局文件,在布局文件中有button等控件時,這些控件獲取
功能1、顯示加載視圖,加載失敗的時候顯示加載失敗視圖,數據為空時顯示數據為空視圖,支持為失敗視圖設置點擊事件重新加載數據。2、支持個性化設置,自定義設置 加載、失敗、空數
本案例在於實現文件的多線程斷點下載,即文件在下載一部分中斷後,可繼續接著已有進度下載,並通過進度條顯示進度。也就是說在文件開始下載的同時,自動創建每個線程的下載進度的本地
小米手環支持什麼手機,是不是只有小米手機才能用?那麼到底小米手環支持什麼手機?小米手環支持其他型號的手機嗎?小編這裡就為大家詳細的說明一下小米手環支持其他手