1. 程式人生 > >Android 網路操作(其中包含xUtils的HttpUtils聯網)

Android 網路操作(其中包含xUtils的HttpUtils聯網)

實現方式 :

1)JAVA中 UrlConnection類的派生類HttpUrlConnection
2)Apache下的HttpClient
3) 第三方框架,常用的第三方框架有xUtils的HttpUtils 、AsyncHttpClient 

HttpUtils 中用到兩個方法send()和download()

AsyncHttpClient方法用到:

BitmapUtils bmpUtils = new BitmapUtils(this) ;

bmpUtils.display(iv, imgUrl) ;

操作步驟 :
1)初始化請求物件
2)設定請求引數
3)網路傳送請求
4)獲取響應結果:判斷結果碼是否是200,如果是則請求成功獲取

 Android 網路操作注意:
1. 新增許可權 Internet許可權,如果第三方網路操作框架還需要WRITE_EXTERNEL_STORAGE

2. 網路請求必須單獨開啟執行緒

在這個過程中遇到的問題:網路請求結果處理:
網路請求必須單獨開啟執行緒,網路請求結果通過控制元件顯示,
android規定非UI主執行緒不能更新控制元件外觀。
解決方案:
1)通過Broadcast解決
2)通過Handler傳送訊息解決
handler = new Handler(){
// 回撥方法,每當handler收到訊息Message時,自動呼叫該方法
public void handleMessage(Message msg) {
switch(msg.what) {
}
};
} ;
Message 的初始化 Message.obtain()
四個屬性 :
what 用來標識訊息型別
以下三個屬性用來傳遞訊息中
資料
Int        arg1 , arg2
Object   obj

1.JAVA中UrlConnection類的派生類HttpUrlConnection(建立網路連線的一個類)

/**
 * 網路請求結果:
 * 		一種是需要字串  String s = new String(byte[])
 * 		一種是需要byte[]
 *
 */
public class NetUrlConnection {
	public static byte[] request(String strUrl){
		byte[] result = null ;
		HttpURLConnection conn = null;
		
		
		try {
			URL url = new URL(strUrl);
			conn = (HttpURLConnection) url.openConnection();
			conn.setConnectTimeout(5*1000);
			conn.setReadTimeout(5*1000);
			conn.connect();
			if(200==conn.getResponseCode()){
				InputStream in = conn.getInputStream();
				//將輸入位元組流轉換
				ByteArrayOutputStream bytearray =new ByteArrayOutputStream();
				byte [] buffer = new byte[4*1024] ;
				int len;
				while(-1 != (len = in.read(buffer))){
					bytearray.write(buffer, 0, len);
				}
				//最後將結果轉換為位元組陣列
				result = bytearray.toByteArray();
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(conn!=null ){
				conn.disconnect();
			}
		}
		return result;
		
	}
}

非UI主執行緒不能更新控制元件外觀,通過Broadcast(廣播)方式處理網路請求結果:
public class MainActivity extends Activity implements OnClickListener {
	TextView text;
	ImageView images;
	String imgurl = "http://img2.duitang.com/uploads/item/201112/18/20111218201622_4LnZS.thumb.600_0.jpg";
	String texturl = "http://api.map.baidu.com/telematics/v3/weather?output=json&ak=wwaIKGCMI1n4teVrz5GjRq57&location=%E5%A4%A9%E6%B4%A5";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		resister();
		setContentView(R.layout.activity_main);
		images = (ImageView) findViewById(R.id.img);
		text = (TextView) findViewById(R.id.text);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_img:
			new Thread() {
				public void run() {
					byte[] r1 = NetUrlConnection.request(imgurl);
					Intent bcIntent = new Intent();
					bcIntent.putExtra("result", r1);
					bcIntent.setAction("com.example.img");
					sendBroadcast(bcIntent);
				};
			}.start();
			break;

		case R.id.btn_text:
			new Thread() {
				public void run() {
					byte[] r2 = NetUrlConnection.request(texturl);
					Intent bcIntent = new Intent();
					bcIntent.putExtra("result", r2);
					bcIntent.setAction("com.example.text");
					sendBroadcast(bcIntent);
				};
			}.start();
			break;
		}
	}

	class Mybroad extends BroadcastReceiver {
		@Override
		public void onReceive(Context context, Intent intent) {
			String action = intent.getAction();
			if (action.equals("com.example.img")) {
				byte[] r1 = intent.getByteArrayExtra("result");
				// 把位元組陣列轉換成圖片
				Bitmap bmp = BitmapFactory.decodeByteArray(r1, 0, r1.length);
				images.setImageBitmap(bmp);
			}
			if (action.equals("com.example.text")) {
				byte[] r2 = intent.getByteArrayExtra("result");
				String txt = new String(r2);
				text.setText(txt);
			}
		}
	}

2.Apache下的HttpClient
public class HttpClientConnection {
	public static byte[] conn(String urlStr) {
		byte[] result = null ;
		
		// 1. 
		HttpClient client = new DefaultHttpClient() ;
		// 2.
		HttpParams params = new BasicHttpParams() ;
		HttpConnectionParams.setConnectionTimeout(params, 5 * 1000) ;
		HttpConnectionParams.setSoTimeout(params, 5 * 1000) ;
		// 3.
		HttpGet request = new HttpGet(urlStr) ;
//		HttpPost request = new HttpPost(urlStr) ;
		try {
			HttpResponse response = client.execute(request) ;
			// 4.
			if(200 == response.getStatusLine().getStatusCode()) {
				HttpEntity entity = response.getEntity() ;
				result = EntityUtils.toByteArray(entity) ;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result ;
	}
}

非UI主執行緒不能更新控制元件外觀,通過Handler機制處理網路請求結果:
public class SecondActivity extends Activity implements OnClickListener {
	private ImageView iv;
	private TextView tv;
	private String imgUrl = "http://img2.duitang.com/uploads/item/201112/18/20111218201622_4LnZS.thumb.600_0.jpg";
	private String txtUrl = "http://api.map.baidu.com/telematics/v3/weather?output=json&ak=wwaIKGCMI1n4teVrz5GjRq57&location=%E5%A4%A9%E6%B4%A5";

	private Handler handler ;
	private ProgressDialog pDialog ;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViewById(R.id.btn_second).setVisibility(View.GONE) ;
		iv = (ImageView) findViewById(R.id.iv);
		tv = (TextView) findViewById(R.id.tv);
		pDialog = new ProgressDialog(this);
		initHandler() ;
	}

	private void initHandler() {
		handler = new Handler(){
			// 回撥方法,每當handler收到訊息Message時,自動呼叫該方法
			public void handleMessage(Message msg) {
				switch(msg.what) {
				case WHAT_IMG :
					pDialog.dismiss();
					byte[] r1 = (byte[]) msg.obj ;
					Bitmap bmp = BitmapFactory.decodeByteArray(r1, 0, r1.length);
					iv.setImageBitmap(bmp);
					break ;
				case WHAT_TXT :
					pDialog.dismiss();
					byte[] r2 = (byte[]) msg.obj ;
					String txt = new String(r2);
					tv.setText(txt);
					break;
				}
			};
		} ;
	}
	final int WHAT_IMG = 1 ;
	final int WHAT_TXT = 2 ;
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_img:
			pDialog.show() ;
			new Thread() {
				public void run() {
					byte[] r1 = HttpClientConnection.conn(imgUrl);
					// 發訊息
					Message msg = Message.obtain() ;
					msg.what = WHAT_IMG ;
					msg.obj = r1;
					handler.sendMessage(msg) ;
				};
			}.start();
			break;
		case R.id.btn_txt:
			pDialog.show() ;
			new Thread() {
				public void run() {
					byte[] r2 = HttpClientConnection.conn(txtUrl);
					Message msg = Message.obtain() ;
					msg.what = WHAT_TXT ;
					msg.obj = r2 ;
					handler.sendMessage(msg) ;
				};
			}.start();
			break;
		}
	}
}


3,這裡介紹HttpUtils框架

使用此框架時,如果顯示圖片只需要執行以下兩句

// ImageView 顯示網路圖片//		
BitmapUtils bmpUtils = new BitmapUtils(this) ;//		
bmpUtils.display(iv, imgUrl) ;

GET方式:

	httpUtis.send(
		HttpMethods.GET  ,
		url , 
		RequestCallBack<T>
	) ;

POST方式:

httpUtis.send(
		HttpMethods.POST ,
		url , 
		params ,
		RequestCallBack<T>
	) ;
關於引數設定:
RequestParams params = new RequestParams();

params.addQueryStringParameter("name", "value");
// addQueryStringParameter將引數新增到url末尾,該引數被web端get方式接收

params.addBodyParameter("name", "value");

// addBodyParameter將引數設定為post方式所需上傳引數,該引數被web端post方式接收

更多介紹檢視1417Demo,Stock專案

以練習的程式碼(來自壓縮包0904.zip)
public class ThirdActivity extends Activity implements OnClickListener {
	private ImageView iv;
	private TextView tv;
	private String imgUrl = "http://img2.duitang.com/uploads/item/201112/18/20111218201622_4LnZS.thumb.600_0.jpg";
	private String txtUrl = "http://api.map.baidu.com/telematics/v3/weather?output=json&ak=wwaIKGCMI1n4teVrz5GjRq57&location=%E5%A4%A9%E6%B4%A5";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViewById(R.id.btn_second).setVisibility(View.GONE);
		findViewById(R.id.btn_third).setVisibility(View.GONE);
		iv = (ImageView) findViewById(R.id.iv);
		tv = (TextView) findViewById(R.id.tv);
		// ImageView 顯示網路圖片
		// BitmapUtils bmpUtils = new BitmapUtils(this) ;
		// bmpUtils.display(iv, imgUrl) ;
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_img:
			downImg();
			break;
		case R.id.btn_txt:
			downTxt();
			break;

		}
	}

	private void downTxt() {
		HttpUtils http = new HttpUtils();
		http.send(HttpRequest.HttpMethod.GET, txtUrl,
				new RequestCallBack<String>() {

					@Override
					public void onSuccess(ResponseInfo<String> responseInfo) {
						String txt = responseInfo.result;
						tv.setText(txt);
					}

					@Override
					public void onFailure(HttpException error, String msg) {
						Toast.makeText(ThirdActivity.this, "下載文字失敗!",
								Toast.LENGTH_LONG).show();
					}
				});
	}

	private void downImg() {
		String target = getExternalCacheDir().getAbsolutePath() + "/"
				+ "temp.jpg";
		HttpUtils http = new HttpUtils();
		http.download(imgUrl, target, true, new RequestCallBack<File>() {

			@Override
			public void onSuccess(ResponseInfo<File> responseInfo) {
				File f = responseInfo.result;
				Log.v("thirdActivity", f.getAbsolutePath());
				Bitmap bmp = BitmapFactory.decodeFile(f.getAbsolutePath());
				iv.setImageBitmap(bmp);
			}

			@Override
			public void onFailure(HttpException error, String msg) {
				Log.v("thirdActivity", error.getMessage() + "|" + msg);
				Toast.makeText(ThirdActivity.this, "下載圖片失敗!", Toast.LENGTH_LONG)
						.show();
			}
		});
	}
}

相關推薦

Android 網路操作其中包含xUtils的HttpUtils聯網

實現方式 : 1)JAVA中 UrlConnection類的派生類HttpUrlConnection2)Apache下的HttpClient3) 第三方框架,常用的第三方框架有xUtils的HttpUtils 、AsyncHttpClient  HttpUtils 中用到兩

vue中一個標籤中含有多個class其中包含三元表示式的寫法

1、陣列形式 <div :class='["classify",current=="0" ? "active" : ""]' @click='current=0'>課程</div> 注意:陣列中的classify如果不加引號的話,代表的是data中的一項,並不是類名

Android網路程式設計使用socket進行通訊

      Socket就是網路套接字程式設計,網路程式設計簡單的理解就是兩臺計算機相互通訊資料而已。對於程式設計師而言,去掌握一種程式設計介面並使用一種程式設計模型相對就會顯得簡單的多了.Java SDK提供一些相對簡單的Api來完成這些工作,這些Api存在與java.n

Android 網路程式設計7: 原始碼解析OkHttp前篇[請求網路]

前言 學會了OkHttp3的用法後,我們當然有必要來了解下OkHttp3的原始碼,當然現在網上的文章很多,我仍舊希望我這一系列文章篇是最簡潔易懂的。 1.從請求處理開始分析 首先OKHttp3如何使用這裡就不在贅述了,不明白的同學可以檢視Android網路程式設計(5):Ok

Android 網路程式設計8: 原始碼解析 OkHttp 中篇[複用連線池]

1.引子 在瞭解OkHttp的複用連線池之前,我們首先要了解幾個概念。 TCP三次握手 通常我們進行HTTP連線網路的時候我們會進行TCP的三次握手,然後傳輸資料,然後再釋放連線。 TCP三次握手的過程為: 第一次握手:建立連線。客戶端傳送連線請求報文段,將SYN位置為1

Android 網路程式設計5: OkHttp2.x用法全解析

前言 講完了Volley,我們接下來看看目前比較火的網路框架OkHttp, 它處理了很多網路疑難雜症:會從很多常用的連線問題中自動恢復。如果您的伺服器配置了多個IP地址,當第一個IP連線失敗的時候,OkHttp會自動嘗試下一個IP,此外OkHttp還處理了代理伺服器問題和SS

Android網路系列:關於計算機網路的一些基礎

    網路一直是專案裡比較重要的一個模組,Android開源專案上出現過很多優秀的網路框架。從一開始只是一些對HttpClient和HttpUrlConnection簡易封裝使用的工具類,到後來Google開源的比較完善豐富的Volley,再到如今比較流行的O

Android網路程式設計ConnectivityManager和NetworkInfo詳解

    一.   ConnectivityManager詳解      概要      ConnectivityManager是網路連線相關的管理器,它主要用於查詢網路狀態並在網路發生改變時發出狀態變化通知。這個類主要負責的下列四個方面:      1.  監控網路狀態(包

Android 網路開發 okHttp網路請求之快取控制Cache-Control

Cache-Control: Cache-Control指定請求和響應遵循的快取機制。在請求訊息或響應訊息中設定Cache-Control並不會修改另一個訊息處理過程中的快取處理過程。請求時的快取指令有下幾種: Public指示響應可被任何快取區快取。 Private指示對於單個

android資料庫操作 某實體類的DAO操作

package com.iceboard.tccme.dao; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.c

web,jsp,html網站中英文切換,資源國際化解決方案及程式碼其中包含動態切換資料來源及URL攔截器.

<!--資料來源 A--> <bean id="dataSourceCn" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 使用properties來配置 -->

Android網路程式設計Volley用法全解析

前言 Volley想必很多人都用過,為了建立網路程式設計的知識體系,Volley是必須要講的知識點,所以我這裡有必要再次介紹一下Volley的使用。 1.Volley簡介 在2013年Google I/O大會上推出了一個新的網路通訊框架Volley

Android網路程式設計HTTP協議原理

 1.HTTP簡介 HTTP是一個屬於應用層的面向物件的協議,由於其簡捷、快速的方式,適用於分散式超媒體資訊系統。它於1990年提出,經過幾年的使用與發展,得到不斷地完善和擴充套件。 HTTP協議的主要特點 支援C/S(客戶/伺服器)模式。簡單快速:客戶向伺服器請求服

android網路操作I: OkHttp, Volley以及Gson

寫這篇文章的動機 在安卓專案中有一個問題可能無法避免:網路。不管你是載入圖片,請求API資料還是從因特網上獲得一個位元組,你都是在使用網路。 鑑於網路在安卓中的重要性與基礎性,當今安卓開發者面臨的問題之一就是使用何種解決方案。有許多優秀的庫,你可以用各種方式把一個用在另一

python文件操作創建與讀取

python 文件操作###############################創建文件########################################### #!/usr/bin/env python ‘‘‘make a test file‘‘‘ import os ls = o

微信小程序 基礎操作邊做邊學

內容 多層 his 路徑 ack navig data 所有 順序 動態修改綁定數據方法,需要使用Page.prototype.setData().setData函數用於將數據異步從邏輯層發送到視圖層。同時改變對應的this.data的值。 小程序使用storage。本地緩

創建表操作含外鍵關聯

成績表 成績 方式 ron numeric 姓名 pos tin cor //創建學生表create table student( sno char(10) primary key,//學號是主鍵 sname char(15) not null,//姓名為非空

elasticsearch 6.0.0及之後移除了一個索引允許映射多個類型的操作Removal of mapping types

user 版本 解決 ase asc adding course 新的 blog 用到了6.2,還以為像5.X 一樣允許建立 父-子關系文檔 ,即一個索引下允許映射多個類型,操作後發現行不通 如下代碼: PUT /company { "mappings": {

文本操作 ls,grep,head,cut

文本操作需求 從一個目錄中取出最近訪問過的5個普通文件,並且要求輸出文件名和最後的訪問時間 解決方案 通過ls -t和-u根據文件的訪問時間進行排序,用|grep過濾出普通文件,在用head過濾出文件列表的前五行,最後用cut剪切無關的數據,只保留訪問時間和文件名 [root@iZ2ze7m4apicbnc8

好消息:51CTO學院講師提現優化,線上支持填寫賬戶信息啦~包含機構哦

提現優化線各位老師,51CTO學院講師提現中心優化,線上支持填寫賬戶信息啦~為了更高效準確的將課酬送達您的提現賬號,各位老師一定按照以下規範將各項信息補充完整哦:首先,講師的提現賬號,授課講師,註冊預留身份號 三方信息需保持一致,為了保障您的賬戶安全,不支持使用其他人的賬號進行提現哦~其次,學院的運營妹子及技