Android簡易實戰教程–第二十五話《網絡圖片查看器》

訪問網絡已經有瞭很成熟的框架。這一篇隻是介紹一下HttpURLConnection的簡單用法,以及裡面的”註意點”。這一篇可以復習或者學習HttpURLConnection、handler、以及Bitmap保存圖片。

需求:點擊按鈕,訪問一張網絡圖片顯示。

佈局很簡單,隻需要一個按鈕一個ImagetView:

 

下面是主程序的代碼,做出瞭逐行解釋。所以不再贅述。如下:

 

 

package com.itydl.imageviewer;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

	static ImageView iv;
	static MainActivity ma;
	static Handler handler = new Handler(){
		//此方法在主線程中調用,可以用來刷新ui
		public void handleMessage(android.os.Message msg) {
			//處理消息時,需要知道到底是成功的消息,還是失敗的消息
			switch (msg.what) {
			case 1:
				//把位圖對象顯示至imageview
				iv.setImageBitmap((Bitmap)msg.obj);
				break;

			case 0:
				Toast.makeText(ma, "請求失敗", 0).show();
				break;
			}
			
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		iv = (ImageView) findViewById(R.id.iv);
		ma = this;
	}

	//點擊按鈕觸發
	public void click(View v){
		Thread t = new Thread(){
			@Override
			public void run() {
				//下載圖片
				//1.確定網址
				String path = "/wp-content/images1/20190315/meinv1872.jpg";
				try {
					//2.把網址封裝成一個url對象
					URL url = new URL(path);
					//3.獲取客戶端和服務器的連接對象,此時還沒有建立連接
					HttpURLConnection conn = (HttpURLConnection) url.openConnection();
					//4.對連接對象進行初始化
					//設置請求方法,註意大寫
					conn.setRequestMethod("GET");
					//設置連接超時
					conn.setConnectTimeout(5000);
					//設置讀取超時
					conn.setReadTimeout(5000);
					//5.發送請求,與服務器建立連接
					conn.connect();
					//如果響應碼為200,說明請求成功
					if(conn.getResponseCode() == 200){
						//獲取服務器響應頭中的流,流裡的數據就是客戶端請求的數據
						InputStream is = conn.getInputStream();
						//直接讀取出流裡的數據,通過輸入流並構造成位圖Bitmap對象。
						Bitmap bm = BitmapFactory.decodeStream(is);
						
						//註意!程序崩潰。子線程不可更新UI
//						ImageView iv = (ImageView) findViewById(R.id.iv);
//						//把位圖對象顯示至imageview
//						iv.setImageBitmap(bm);
						//使用Handler機制
						Message msg = new Message();
						//消息對象可以攜帶數據
						msg.obj = bm;
						msg.what = 1;
						//把消息發送至主線程的消息隊列
						handler.sendMessage(msg);
						
					}
					else{
						//註意!程序崩潰。子線程不可更新UI
//						Toast.makeText(MainActivity.this, "請求失敗", 0).show();
						//使用Handler機制
						Message msg = handler.obtainMessage();
						msg.what = 0;
						handler.sendMessage(msg);
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		};
		t.start();
		
	}

}

 

接下來來看一下美女長什麼樣子吧!!

 

 

雖然很簡單,但是有三個地方再嘮叨一下:

Bitmap bm = BitmapFactory.decodeStream(is);//直接獲取位圖

iv.setImageBitmap((Bitmap)msg.obj);//直接位圖放入ImageView

//網略權限

Handler機制的簡單用法。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *