編輯:關於Android編程
在Android應用開發中,我們經常會與服務器交互,獲取或上傳數據,這就需要用到網絡請求,一般情況下是使用HTTP協議去發送和接收網絡數據,而HTTP又包括兩種通信方式,即:HttpUrlConnection和HttpClient。
代碼例子:https://git.oschina.net/ysx_xx/HttpText/tree/master
下面我簡單地介紹這兩種方式的使用:
首先,要進行網絡請求,我們要先給應用添加網絡權限,有兩種方式添加:
1. 打開AndroidManifest.xml文件,選擇permission,點擊Add:
選擇最後一個UsesPermission:
然後在右邊Name選項找到android.permission.INTERNET,保存
然後再選擇AndroidManifest.xml選項,就能看到
-------------------------------------------------------------------------------------------------------------------------------------------------------
好了,下面來講講那兩種請求方式的使用
1. HttpUrlConnection:
先new一個URL對象並傳入網絡地址,再調用openConnection()方法獲取HttpUrlConnection實例,然後設置HTTP請求的方法(GET/POST),接著設置連接超時、讀取超時、消息頭等,這個可以根據實際情況編寫,之後用getInputStream()方法獲取從服務器返回的輸入流,並讀取內容,最後調用disconnect()方法關閉。
代碼:
new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection = null; try { URL url = new URL("http://www.baidu.com/"); // 調用URL的openConnection()方法,得到HttpURLConnection的實例 connection = (HttpURLConnection) url.openConnection(); // 設置HTTP請求方法為GET,一般GET為從服務器獲取數據,POST為提交數據給服務器 connection.setRequestMethod("GET"); // 設置連接超時的毫秒數 connection.setConnectTimeout(8000); // 設置讀取超時的毫秒數 connection.setReadTimeout(8000); // 獲取服務器返回的輸入流 InputStream in = connection.getInputStream(); // 對獲取到的輸入流進行讀取 BufferedReader reader = new BufferedReader( new InputStreamReader(in)); String response = "", line; while ((line = reader.readLine()) != null) { response += line; } //獲取成功,發送成功信息 Message message = new Message(); message.what = SUCCESS; message.obj = response; mHandler.sendMessage(message); } catch (Exception e) { //發送失敗信息 Message message = new Message(); message.what = FAILE; message.obj = "請求失敗"; mHandler.sendMessage(message); e.printStackTrace(); } finally { if (connection != null) { //如果connection為null,則關閉它 connection.disconnect(); } } } }).start();
運行效果如下:
以上是介紹GET方式,那如果要向服務器提交數據呢?
我們可以把請求方式改為POST,並提交參數
例如:
connection.setRequestMethod(“POST”); DataOutputStream out = new DataOutputStream(connection.getOutputStream()); out.writeBytes(“username=小熊&password=123456”);
2. 下面來看看HttpClient的用法:
HttpClient是一個接口,我們要先創建一個DefaultHttpClient的實例,再創建一個HttpGet對象並傳入網絡地址,然後調用HttpClient的execute()方法發送GET請求,最後調用HttpResponse的getStatusLine()的getStatusCode()方法獲取服務器返回的狀態碼,如果為200則說明成功
代碼:
new Thread(new Runnable() { @Override public void run() { try { //因為HttpClient是一個接口,所以用DefaultHttpClient()方法創建一個實例 HttpClient httpClient = new DefaultHttpClient(); //創建HttpGet對象並傳入網絡地址,並調用HttpClient的execute方法發送GET請求 HttpGet httpGet = new HttpGet("http://www.baidu.com"); HttpResponse httpResponse = httpClient.execute(httpGet); //先取出服務器返回的狀態碼,如果是200則說明請求響應成功,這裡可以自行判斷獲得的狀態碼 //是什麼來判斷是否成功或是什麼失敗 if(httpResponse.getStatusLine().getStatusCode() == 200){ //請求響應成功,調用getEntity()方法獲取HttpEntity實例並轉換成字符串 HttpEntity entity = httpResponse.getEntity(); String response = EntityUtils.toString(entity, "utf-8"); //獲取成功,發送成功信息 Message message = new Message(); message.what = SUCCESS; message.obj = response; mHandler.sendMessage(message); } } catch (Exception e) { //發送失敗信息 Message message = new Message(); message.what = FAILE; message.obj = "請求失敗"; mHandler.sendMessage(message); e.printStackTrace(); } } }).start();
運行效果跟HttpURLConnection一樣,這裡就不多發一遍了。下面是HttpClient的POST方式:
關鍵代碼:
HttpPost httpPost = new HttpPost("http://www.baidu.com"); Listparams = new ArrayList (); params.add(new BasicNameValuePair("username", "小熊")); params.add(new BasicNameValuePair("password", "123456")); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "utf-8"); httpPost.setEntity(entity); httpClient.execute(httpPost);
HttpURLConnectionText.java:
public class HttpURLConnectionText extends Activity implements OnClickListener { private final static int SUCCESS = 1; private final static int FAILE = 0; private TextView result; private Button send; private LoadingDialog loadingDialog; private Context mContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); } private void initData() { mContext = this; result = (TextView) findViewById(R.id.result); send = (Button) findViewById(R.id.send); send.setOnClickListener(this); } private Handler mHandler = new Handler() { public void handleMessage(Message msg) { String response; if(loadingDialog != null && loadingDialog.isShowing()){ loadingDialog.dismiss(); } switch (msg.what) { case SUCCESS: response = msg.obj.toString(); result.setText(response); break; case FAILE: response = msg.obj.toString(); result.setText(response); break; } }; }; @Override public void onClick(View v) { switch (v.getId()) { case R.id.send: loadingDialog = new LoadingDialog(mContext); loadingDialog.setCancel(false); loadingDialog.show(); startSend(); break; } } private void startSend() { new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection = null; try { URL url = new URL("http://www.baidu.com/"); // 調用URL的openConnection()方法,得到HttpURLConnection的實例 connection = (HttpURLConnection) url.openConnection(); // 設置HTTP請求方法為GET,一般GET為從服務器獲取數據,POST為提交數據給服務器 connection.setRequestMethod("GET"); // 設置連接超時的毫秒數 connection.setConnectTimeout(8000); // 設置讀取超時的毫秒數 connection.setReadTimeout(8000); // 獲取服務器返回的輸入流 InputStream in = connection.getInputStream(); // 對獲取到的輸入流進行讀取 BufferedReader reader = new BufferedReader( new InputStreamReader(in)); String response = "", line; while ((line = reader.readLine()) != null) { response += line; } //獲取成功,發送成功信息 Message message = new Message(); message.what = SUCCESS; message.obj = response; mHandler.sendMessage(message); } catch (Exception e) { //發送失敗信息 Message message = new Message(); message.what = FAILE; message.obj = "請求失敗"; mHandler.sendMessage(message); e.printStackTrace(); } finally { if (connection != null) { //如果connection為null,則關閉它 connection.disconnect(); } } } }).start(); } }
HttpClientText.java:
public class HttpClientText extends Activity implements OnClickListener { private final static int SUCCESS = 1; private final static int FAILE = 0; private TextView result; private Button send; private LoadingDialog loadingDialog; private Context mContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); } private void initData() { mContext = this; result = (TextView) findViewById(R.id.result); send = (Button) findViewById(R.id.send); send.setOnClickListener(this); } private Handler mHandler = new Handler() { public void handleMessage(Message msg) { String response; if(loadingDialog != null && loadingDialog.isShowing()){ loadingDialog.dismiss(); } switch (msg.what) { case SUCCESS: response = msg.obj.toString(); result.setText(response); break; case FAILE: response = msg.obj.toString(); result.setText(response); break; } }; }; @Override public void onClick(View v) { switch (v.getId()) { case R.id.send: loadingDialog = new LoadingDialog(mContext); loadingDialog.setCancel(false); loadingDialog.show(); startSend(); break; } } private void startSend() { new Thread(new Runnable() { @Override public void run() { try { //因為HttpClient是一個接口,所以用DefaultHttpClient()方法創建一個實例 HttpClient httpClient = new DefaultHttpClient(); //創建HttpGet對象並傳入網絡地址,並調用HttpClient的execute方法發送GET請求 HttpGet httpGet = new HttpGet("http://www.baidu.com"); HttpResponse httpResponse = httpClient.execute(httpGet); //先取出服務器返回的狀態碼,如果是200則說明請求響應成功,這裡可以自行判斷獲得的狀態碼 //是什麼來判斷是否成功或是什麼失敗 if(httpResponse.getStatusLine().getStatusCode() == 200){ //請求響應成功,調用getEntity()方法獲取HttpEntity實例並轉換成字符串 HttpEntity entity = httpResponse.getEntity(); String response = EntityUtils.toString(entity, "utf-8"); //獲取成功,發送成功信息 Message message = new Message(); message.what = SUCCESS; message.obj = response; mHandler.sendMessage(message); } } catch (Exception e) { //發送失敗信息 Message message = new Message(); message.what = FAILE; message.obj = "請求失敗"; mHandler.sendMessage(message); e.printStackTrace(); } } }).start(); } }
閒來無事,總結了兩個自定義的ProgressDialog,大家可以參考下,根據自己需要進行選擇修改:實現效果:示例1:示例2: 代碼如下:MainA
中國移動推出的一卡多號業務可以在已有移動手機號上增加1-3個副號,不用換機、換卡。特別適合想擁有多個手機號碼的用戶或需要保護隱私的用戶服務。在不增加手機、不
最近項目上需要實現藍牙傳輸apk的一個功能,能夠搜索周圍的藍牙手機並分享文件。從需求上講android手機自帶的藍牙傳輸模塊就可以滿足需要了,實現也很簡單。不過讓人頭疼的
上圖Tab的背景效果,和帶陰影的圓角矩形,是怎麼實現的呢?大部分的人會讓美工切圖,用點九圖做背景。但是,如果只提供一張圖,會怎麼樣呢?比如,中間的Tab背景紅色底線的像素