ImageView顯示網路上的圖片
一、簡介
二、方法
1)ImageView顯示網路上的圖片方法
第一步:從網路上下載圖片
byte[] byteArr = downImage();//這個是自己寫的函式
將byte陣列轉換成bitmap
Bitmap bitmap1 = BitmapFactory.decodeByteArray(byteArr, 0,byteArr.length);
第二步:在imageView控制元件上顯示圖片
iv_fromNet.setImageBitmap(bitmap1);
第三步:給手機設定能聯網的屬性
在AndroidManifest.xml中設定能聯網的許可權
<uses-permission android:name="android.permission.INTERNET" />
2)從網路上下載圖片的方法
第一步:建立url連線
URL url = new URL("http://img5.imgtn.bdimg.com/it/u=3902436073,1089717092&fm=26&gp=0.jpg");
第二步:拿到HTTP連線物件
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
第三步:設定連線超時
connection.setConnectTimeout(5000);
第四步:設定HTTP請求方式
connection.setRequestMethod("GET");
第五步:獲得響應狀態碼
int code = connection.getResponseCode();
連線成功後
第六步:拿到輸入流,用於讀取響應的內容
InputStream is = connection.getInputStream();
第七步:輸出流用於寫資料
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
第八步:讀取資料就好
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
byteArrayOut.write(buffer, 0, len);
}
return byteArrayOut.toByteArray();
三、程式碼例項
效果圖:
點選按鈕之後,獲取http://img5.imgtn.bdimg.com/it/u=3902436073,1089717092&fm=26&gp=0.jpg的圖片
程式碼:
/iamgeViewDemo1/src/fry/Activity04.java
1 package fry; 2 3 import java.io.ByteArrayInputStream; 4 import java.io.ByteArrayOutputStream; 5 import java.io.InputStream; 6 import java.net.HttpURLConnection; 7 import java.net.MalformedURLException; 8 import java.net.URL; 9 import com.example.iamgeViewDemo1.R; 10 import android.annotation.SuppressLint; 11 import android.app.Activity; 12 import android.graphics.Bitmap; 13 import android.graphics.BitmapFactory; 14 import android.graphics.Matrix; 15 import android.graphics.drawable.BitmapDrawable; 16 import android.graphics.drawable.Drawable; 17 import android.os.Bundle; 18 import android.os.StrictMode; 19 import android.util.DisplayMetrics; 20 import android.view.View; 21 import android.view.View.OnClickListener; 22 import android.view.ViewGroup.LayoutParams; 23 import android.widget.Button; 24 import android.widget.ImageView; 25 import android.widget.LinearLayout; 26 import android.widget.SeekBar; 27 import android.widget.SeekBar.OnSeekBarChangeListener; 28 29 public class Activity04 extends Activity { 30 // 1)ImageView顯示網路上的圖片方法 31 // 第一步:從網路上下載圖片 32 // 33 // 第二步:在imageView控制元件上顯示圖片 34 // 35 // 第三步:給手機設定能聯網的屬性 36 private ImageView iv_fromNet; 37 private Button btn_downLoadImage; 38 39 @SuppressLint("NewApi") 40 @Override 41 protected void onCreate(Bundle savedInstanceState) { 42 // TODO Auto-generated method stub 43 setTitle("imageView顯示網路上的圖片"); 44 super.onCreate(savedInstanceState); 45 46 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 47 .detectDiskReads().detectDiskWrites().detectNetwork() 48 .penaltyLog().build()); 49 StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() 50 .detectLeakedSqlLiteObjects().detectLeakedClosableObjects() 51 .penaltyLog().penaltyDeath().build()); 52 53 setContentView(R.layout.activity03); 54 55 btn_downLoadImage = (Button) findViewById(R.id.btn_downLoadImage); 56 iv_fromNet = (ImageView) findViewById(R.id.iv_fromNet); 57 58 btn_downLoadImage.setOnClickListener(new OnClickListener() { 59 60 @Override 61 public void onClick(View v) { 62 // TODO Auto-generated method stub 63 64 65 66 67 BitmapDrawable bitmapDrawable=(BitmapDrawable)(getResources().getDrawable(R.drawable.image1)); 68 Bitmap bitmap2=bitmapDrawable.getBitmap(); 69 // 70 // iv_fromNet.setImageBitmap(bitmap2); 71 72 // 從網路上下載圖片 73 byte[] byteArr = downImage(); 74 75 // 在imageView控制元件上顯示圖片 76 Bitmap bitmap1 = BitmapFactory.decodeByteArray(byteArr, 0, 77 byteArr.length); 78 iv_fromNet.setImageBitmap(bitmap1); 79 // 給手機設定能聯網的屬性 80 81 82 } 83 }); 84 85 } 86 87 /** 88 * 從網路中下載圖片 89 * 90 */ 91 private byte[] downImage() { 92 try { 93 //建立url連線 94 URL url = new URL( 95 "http://img5.imgtn.bdimg.com/it/u=3902436073,1089717092&fm=26&gp=0.jpg"); 96 // 拿到HTTP連線物件 97 HttpURLConnection connection = (HttpURLConnection) url 98 .openConnection(); 99 // 設定連線超時 100 connection.setConnectTimeout(5000); 101 // HTTP請求方式 102 connection.setRequestMethod("GET"); 103 // 獲得響應狀態碼 104 int code = connection.getResponseCode(); 105 if (code == 200) {// 表示獲取成功 106 // 拿到輸入流,用於讀取響應的內容 107 InputStream is = connection.getInputStream(); 108 // 輸出流用於寫資料 109 ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); 110 // 設定快取陣列 111 byte[] buffer = new byte[1024]; 112 int len; 113 while ((len = is.read(buffer)) != -1) { 114 byteArrayOut.write(buffer, 0, len); 115 } 116 return byteArrayOut.toByteArray(); 117 } 118 119 } catch (Exception e) { 120 // TODO Auto-generated catch block 121 e.printStackTrace(); 122 } 123 124 return null; 125 } 126 127 // 2)從網路上下載圖片的方法 128 // 129 // 第一步:建立url連線 130 // 第二步:拿到HTTP連線物件 131 // 第三步:設定連線超時 132 // 第四步:設定HTTP請求方式 133 // 第五步:獲得響應狀態碼 134 // 連線成功後 135 // 136 // 第六步:拿到輸入流,用於讀取響應的內容 137 // 第七步:輸出流用於寫資料 138 // 第八步:讀取資料就好 139 140 }
/iamgeViewDemo1/res/layout/activity03.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <Button 8 android:id="@+id/btn_downLoadImage" 9 android:layout_width="match_parent" 10 android:layout_height="wrap_content" 11 android:text="從網路上下載圖片" 12 /> 13 14 <ImageView 15 android:id="@+id/iv_fromNet" 16 android:layout_width="match_parent" 17 android:layout_height="match_parent" 18 /> 19 20 </LinearLayout>
/iamgeViewDemo1/AndroidManifest.xml
1 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 package="com.example.iamgeViewDemo1" 3 android:versionCode="1" 4 android:versionName="1.0" > 5 6 <uses-permission android:name="android.permission.INTERNET" /> 7 8 <uses-sdk 9 android:minSdkVersion="8" 10 android:targetSdkVersion="19" /> 11 12 <application 13 android:allowBackup="true" 14 android:icon="@drawable/ic_launcher" 15 android:label="@string/app_name" 16 android:theme="@style/AppTheme" > 17 <activity 18 android:name="fry.MainActivity" 19 android:label="@string/app_name" > 20 <intent-filter> 21 <action android:name="android.intent.action.MAIN" /> 22 23 <category android:name="android.intent.category.LAUNCHER" /> 24 </intent-filter> 25 </activity> 26 <activity 27 android:name="fry.Activity01" 28 android:exported="true" > 29 </activity> 30 <activity 31 android:name="fry.Activity02" 32 android:exported="true" > 33 </activity> 34 <activity 35 android:name="fry.Activity03" 36 android:exported="true" > 37 </activity> 38 <activity 39 android:name="fry.Activity04" 40 android:exported="true" > 41 </activity> 42 </application> 43 44 </manifest>
四、收穫
1、debug找錯誤
2、原始碼和方法說明找bug
3、輸入流和輸出流
輸入內容到輸入流,然後到記憶體,記憶體中的資料到輸出流,輸出流的資料到輸出。
1)拿到輸入流,用於讀取響應的內容
InputStream is = connection.getInputStream();
2)把輸入流is中的東西讀到buffer中
is.read(buffer)
3)buffer中的內容寫到輸出流byteArrayOut
byteArrayOut.write(buffer, 0, len);
4、byte array變成bitmap
Bitmap bitmap1 = BitmapFactory.decodeByteArray(byteArr, 0,byteArr.length);
5、建立url連線
URL url = new URL("http://img5.imgtn.bdimg.com/it/u=3902436073,1089717092&fm=26&gp=0.jpg");
6、拿到HTTP連線物件
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
五、遇到的bug
1、android.os.NetworkOnMainThreadException
這是因為在android3.0後主執行緒中不許網路連線
解決方法:新增了一段執行緒警察的程式碼
2、bitmap1==null但是用於建立bitmap1的byte array有資料
byte array不能被decode,換一張圖片就好
3、還有很多bug,都忘記了