編輯:關於Android編程
在Android中,如果我們要展示的圖片是存儲在網絡上的時候,我們就必須通過HttpClient或者HttpUrlConnection這兩個類來進行關於網絡方面的操作,比如下面中利用GridView來展示幾個圖片:

關於GridView如何來展示圖片就不多講了,這個其實是跟ListView利用BaseAdapter來展示的原理是一樣的,大家有興趣可以下面的文章看一下:
Android中關於Adapter的使用(下)BaseAdapter
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1NrV4sDvo6zO0sPHz8i/tNK7z8LU9cO0wPvTw0h0dHBVcmxDb25uZWN0aW9uwLS78cihzfjC58nPtcTNvMastcShozwvcD4KPHA+MaOpytfPyMrHzbzGrNS0o7o8L3A+CjxwPjxwcmUgY2xhc3M9"brush:java;"> private static final String[] URLS = {
"http://img.my.csdn.net/uploads/201403/03/1393854094_4652.jpg",
"http://img.my.csdn.net/uploads/201403/03/1393854084_6138.jpg",
"http://img.my.csdn.net/uploads/201403/03/1393854084_1323.jpg",
"http://img.my.csdn.net/uploads/201403/03/1393854084_8439.jpg",
"http://img.my.csdn.net/uploads/201403/03/1393854083_6511.jpg",
"http://img.my.csdn.net/uploads/201403/03/1393854083_2323.jpg"
};
private static final String[] DESCS = {
"photo1","photo2","photo3","photo4","photo5","photo6"
};
2)在BaseAdapter的getView方法中,我們要去獲取網絡上的圖片,並將其轉化為Bitmap,代碼如下:
viewHolder.ivImage.setImageBitmap(readBitmapFromUrl(URLS[position]));
...
public Bitmap readBitmapFromUrl(String imgUrl){
BitmapFactory.Options op = new BitmapFactory.Options();
op.inPreferredConfig = Bitmap.Config.ARGB_8888;
op.inDither = false;
op.inScaled = false;
Bitmap bitmap = null;
try {
URL url = new URL(imgUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3 * 1000);
if(conn.getResponseCode() != 200){
throw new RuntimeException("Request Failed");
}
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is,null,op);
bitmap = Helper.zoomBitmap(bitmap, 150, 150);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}在這裡,我們首先根據參數imgUrl定義了URL對象,並通過openConnection函數返回HttpURLConnection對象,然後利用BitmapFactory的decodeStream方法將Response的stream給解析成對應的Bitmap,而獲取到的圖片可能是比較大的,我們需要將其縮小到適合的大小,以便在屏幕上顯示,於是我們又調用了zoomBitamp函數(自定義的函數)來進行一個縮小的操作。
我們會發現,雖然我們能夠利用HttpURLConnection這樣去實現我們想要的功能,但是需要我們自己去做的事情還是太多了,尤其是在上面還沒有考慮圖片非常多的情況,沒有考慮緩存,網絡請求等方面的因素,真的要去考慮,會煩死的。
而且上面的代碼只是適宜運行在2.3以上,4.0以下的機器,在4.0以上的機器,是不允許我們直接這樣去用HttpURLConnection來進行網絡方面的通訊的,會爆下面的錯誤的,如下:
03-04 23:18:44.773: E/AndroidRuntime(13299): android.os.NetworkOnMainThreadException 03-04 23:18:44.773: E/AndroidRuntime(13299): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1103) 03-04 23:18:44.773: E/AndroidRuntime(13299): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 03-04 23:18:44.773: E/AndroidRuntime(13299): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 03-04 23:18:44.773: E/AndroidRuntime(13299): at java.net.InetAddress.getAllByName(InetAddress.java:220) 03-04 23:18:44.773: E/AndroidRuntime(13299): at libcore.net.http.HttpConnection.(HttpConnection.java:71) 03-04 23:18:44.773: E/AndroidRuntime(13299): at libcore.net.http.HttpConnection. (HttpConnection.java:50) 03-04 23:18:44.773: E/AndroidRuntime(13299): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 03-04 23:18:44.773: E/AndroidRuntime(13299): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 03-04 23:18:44.773: E/AndroidRuntime(13299): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 03-04 23:18:44.773: E/AndroidRuntime(13299): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 03-04 23:18:44.773: E/AndroidRuntime(13299): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:460) 03-04 23:18:44.773: E/AndroidRuntime(13299): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:432)
我覺得開發的,就要善於去利用各種各樣的工具來減輕我們的時間成本,而Volley就是Android中一個很好的網絡通信的小工具啦,雖然我們自己包裝一下,也能夠做到同樣的功能,但是有時候,人與人之間的的差別還真是在那裡的,有些人就能夠做得很好,而有些人就真的做不到那麼好,跑題了,只是感歎一下牛人的世界。
那麼如何利用Volley來實現網絡圖片的加載呢?其實有很多種方式的,今天我們就先講一種最簡單的加載方式,代碼如下:
1)定義一個RequestQueue,如下:
private RequestQueue mQueue;
mQueue = Volley.newRequestQueue(this);
public void readBitmapViaVolley(String imgUrl, final ImageView imageView) {
ImageRequest imgRequest = new ImageRequest(imgUrl,
new Response.Listener() {
@Override
public void onResponse(Bitmap arg0) {
// TODO Auto-generated method stub
imageView.setImageBitmap(arg0);
}
},
300,
200,
Config.ARGB_8888,
new ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
}
});
mQueue.add(imgRequest);
} 在上面,我們可以看到,在ImageRequest的構造函數中,我們就可以直接將一些關於Bitmap的參數給傳進去了,比如長寬等信息,然後在其返回的Response.Listener中獲得返回的結果,就是一個Bitmap了,並在onResponse函數中對ImageView進行設置,最後將其添加到mQueue中。
4)當上面的一切都做好之後,就可以了,實現的效果跟我們利用HttpURLConnection來實現的效果是一模一樣的,而且更快,代碼也簡潔很多,是不?
Volley的功能不僅僅是這樣簡單地用簡潔的代碼來幫我們包裝函數,也不僅僅只是操作圖片,在其隱藏在後面的代碼中,還做了其它一些工作,比如:
1)緩存的使用,包括內存和SD卡
2)網絡請求隊列的處理跟優化
3)圖片加載的優化
4)對JSON數據的優化等
後面有時間,大家一起來學習學習吧。
你的應用是如何被替換的,App劫持病毒剖析
一.App劫持病毒介紹App劫持是指執行流程被重定向,又可分為Activity劫持、安裝劫持、流量劫持、函數執行劫持等。本文將對近期利用Acticity劫持和安裝劫持的病
AIDL/IPC Android AIDL/IPC 進程通信機制——超詳細講解及用法案例剖析(播放器)
首先引申下AIDL,什麼是AIDL呢?IPC? ------ Designing a Remote Interface Using AIDL 通常情況下,我們在同一進程內
小米5尊享版和標准版有什麼區別
小米5尊享版和標准版有什麼區別?備受期待的小米手機5於2月24日發布,推出了三個版本,分別是標准版、高配版和尊享版,標准版和高配版僅在內存上有不同,而尊享版
Android 開機自啟動示例程序
Android 開機自啟動示例程序。使用廣播方式接受,采用Android自帶存儲SharedPreferences存儲開機自啟動的設置。本文源碼:點擊1、先加上權限&nb