網路請求圖片

c_clear發表於2015-12-30
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span><span style="font-family: Arial, Helvetica, sans-serif;">注意請求時,需要新增許可權,INTERNET</span>

public void click(View v) {
		String path = "需要請求的網路地址";
		//傳送http請求
		try {
			//建立一個url物件
			URL url = new URL(path);
			//獲得要請求的物件
			HttpURLConnection huc = (HttpURLConnection) url.openConnection();
			//設定一些屬性
			//設定請求方式,注意大寫
			huc.setRequestMethod("GET");
			//設定請求超時
			huc.setConnectTimeout(8000);
			//設定讀取超時
			huc.setReadTimeout(8000);
			//傳送連結
			huc.connect();
			//code 200,就代表請求成功
			if (huc.getResponseCode()==200) {
				//獲取伺服器返回的流,流就是從伺服器取到的資料
				InputStream is = huc.getInputStream();
				//把下載的資料整成一個圖片
                                //讀取的流必須就是一張圖片,是文字,會報錯
				Bitmap bp = BitmapFactory.decodeStream(is);
				//把圖片放到imageview中
				ImageView ig = (ImageView) findViewById(R.id.im);
				ig.setImageBitmap(bp);
			}else{
				Toast.makeText(this, "error", 0).show();
				
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	


注意,網路請求不能寫在主執行緒,此程式在4.3模擬器會報警告,無輸出結果。

主執行緒阻塞,使用者的所有操作,都會停止響應

ANR異常:應用無響應,主執行緒阻塞時間太長

注意,只有主執行緒才能重新整理UI,用訊息佇列,可以讓子執行緒重新整理UI

訊息佇列:主執行緒建立時,自動生成兩個:1messagequeen 訊息佇列,用來存放訊息   2Looper 不停地檢測訊息佇列中是否有訊息

為了使用訊息佇列,我們要建立一個Handler物件(處理器),即訊息處理器,專門用來處理訊息,重新整理子執行緒。 Looper如果發現有訊息,就會把訊息交給handeler處理。

有訊息,handler會生成一個handelermessage方法(處理訊息)。子執行緒想重新整理UI,獲得handler物件,在messagequeen中放一個訊息(用sendmessage方法)。


 

public class MainActivity extends Activity {

	Handler handler = new Handler(){
	
		public void handleMessage(android.os.Message msg) {
			ImageView img = (ImageView) findViewById(R.id.img);
			img.setImageBitmap((Bitmap) msg.obj);
		};
		
	};
	
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}


	public void click() {
		
		Thread t = new Thread(){
			public void run() {
				//請求個圖
				String path = "";
				try {
					//轉換成url
					URL url = new URL(path);
					//獲取要請求的物件
					HttpURLConnection hucn = (HttpURLConnection) url.openConnection();
					//設定一些屬性
					hucn.setRequestMethod("GET");
					hucn.setReadTimeout(8000);
					hucn.setConnectTimeout(8000);
					hucn.connect();
					if (hucn.getResponseCode()==200) {
						InputStream is = hucn.getInputStream();
						//把下載的資料整成一個圖片
						Bitmap bp = BitmapFactory.decodeStream(is);
						//重新整理ui工作在主執行緒中的handelermessage中完成,在此通知
						Message msg = new Message();
						handler.sendMessage(msg);
						msg.obj = bp;
//						ImageView img = (ImageView) findViewById(R.id.img);
//						img.setImageBitmap(bp);
					} else {

					}
				
				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}
				
			}
			};
			t.start();
		}


相關文章