#網絡圖片查看器html
肯定圖片的網址android
發送http請求git
URL url = new URL(address); //獲取鏈接對象,並無創建鏈接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //設置鏈接和讀取超時 conn.setConnectTimeout(5000); conn.setReadTimeout(5000); //設置請求方法,注意必須大寫 conn.setRequestMethod("GET"); //創建鏈接,發送get請求 //conn.connect(); //創建鏈接,而後獲取響應嗎,200說明請求成功 conn.getResponseCode();
服務器的圖片是以流的形式返回給瀏覽器的github
//拿到服務器返回的輸入流 InputStream is = conn.getInputStream(); //把流裏的數據讀取出來,並構形成圖片 Bitmap bm = BitmapFactory.decodeStream(is);
把圖片設置爲ImageView的顯示內容數組
ImageView iv = (ImageView) findViewById(R.id.iv); iv.setImageBitmap(bm);
添加權限瀏覽器
###主線程不能被阻塞緩存
在Android中,主線程被阻塞會致使應用不能刷新ui界面,不能響應用戶操做,用戶體驗將很是差服務器
主線程阻塞時間過長,系統會拋出ANR異常網絡
ANR:Application Not Response;應用無響應app
任何耗時操做都不能夠寫在主線程
由於網絡交互屬於耗時操做,若是網速很慢,代碼會阻塞,因此網絡交互的代碼不能運行在主線程
###只有主線程能刷新ui
刷新ui的代碼只能運行在主線程,運行在子線程是沒有任何效果的
若是須要在子線程中刷新ui,使用消息隊列機制
#####消息隊列
Looper一旦發現Message Queue中有消息,就會把消息取出,而後把消息扔給Handler對象,Handler會調用本身的handleMessage方法來處理這條消息
handleMessage方法運行在主線程
主線程建立時,消息隊列和輪詢器對象就會被建立,可是消息處理器對象,須要使用時,自行建立
//消息隊列 Handler handler = new Handler(){ //主線程中有一個消息輪詢器looper,不斷檢測消息隊列中是否有新消息,若是發現有新消息,自動調用此方法,注意此方法是在主線程中運行的 public void handleMessage(android.os.Message msg) { } };
在子線程中往消息隊列裏發消息
//建立消息對象 Message msg = new Message(); //消息的obj屬性能夠賦值任何對象,經過這個屬性能夠攜帶數據 msg.obj = bm; //what屬性至關於一個標籤,用於區分出不一樣的消息,從而運行不能的代碼 msg.what = 1; //發送消息 handler.sendMessage(msg);
經過switch語句區分不一樣的消息
public void handleMessage(android.os.Message msg) { switch (msg.what) { //若是是1,說明屬於請求成功的消息 case 1: ImageView iv = (ImageView) findViewById(R.id.iv); Bitmap bm = (Bitmap) msg.obj; iv.setImageBitmap(bm); break; case 2: Toast.makeText(MainActivity.this, "請求失敗", 0).show(); break; } }
###加入緩存圖片的功能
把服務器返回的流裏的數據讀取出來,而後經過文件輸入流寫至本地文件
//1.拿到服務器返回的輸入流 InputStream is = conn.getInputStream(); //2.把流裏的數據讀取出來,並構形成圖片 FileOutputStream fos = new FileOutputStream(file); byte[] b = new byte[1024]; int len = 0; while((len = is.read(b)) != -1){ fos.write(b, 0, len); }
建立bitmap對象的代碼改爲
Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
每次發送請求前檢測一下在緩存中是否存在同名圖片,若是存在,則讀取緩存
#獲取開源代碼的網站
code.google.com
github.com
在github搜索smart-image-view
下載開源項目smart-image-view
使用自定義組件時,標籤名字要寫包名
<com.loopj.android.image.SmartImageView/>
SmartImageView的使用
SmartImageView siv = (SmartImageView) findViewById(R.id.siv); siv.setImageUrl("http://192.168.1.102:8080/dd.jpg");
#Html源文件查看器
發送GET請求
URL url = new URL(path); //獲取鏈接對象 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //設置鏈接屬性 conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); //創建鏈接,獲取響應嗎 if(conn.getResponseCode() == 200){ }
獲取服務器返回的流,從流中把html源碼讀取出來
byte[] b = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while((len = is.read(b)) != -1){ //把讀到的字節先寫入字節數組輸出流中存起來 bos.write(b, 0, len); } //把字節數組輸出流中的內容轉換成字符串 //默認使用utf-8 text = new String(bos.toByteArray());
###亂碼的處理
亂碼的出現是由於服務器和客戶端碼錶不一致致使
//手動指定碼錶 text = new String(bos.toByteArray(), "gb2312");
#提交數據
###GET方式提交數據
get方式提交的數據是直接拼接在url的末尾
final String path = "http://192.168.1.104/Web/servlet/CheckLogin?name=" + name + "&pass=" + pass;
發送get請求,代碼和以前同樣
URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setReadTimeout(5000); conn.setConnectTimeout(5000); if(conn.getResponseCode() == 200){ }
瀏覽器在發送請求攜帶數據時會對數據進行URL編碼,咱們寫代碼時也須要爲中文進行URL編碼
String path = "http://192.168.1.104/Web/servlet/CheckLogin?name=" + URLEncoder.encode(name) + "&pass=" + pass;
###POST方式提交數據
post提交數據是用流寫給服務器的
協議頭中多了兩個屬性
Content-Type: application/x-www-form-urlencoded,描述提交的數據的mimetype
Content-Length: 32,描述提交的數據的長度
//給請求頭添加post多出來的兩個屬性 String data = "name=" + URLEncoder.encode(name) + "&pass=" + pass; conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", data.length() + "");
設置容許打開post請求的流
conn.setDoOutput(true);
獲取鏈接對象的輸出流,往流裏寫要提交給服務器的數據
OutputStream os = conn.getOutputStream(); os.write(data.getBytes());
#網絡請求
###主線程阻塞
*UI中止刷新,應用沒法響應用戶操做
* 耗時操做不該該在主線程進行
* ANR
* application not responding
* 應用無響應異常
* 主線程阻塞時間過長,就會拋出ANR
* 主線程又稱UI線程,由於只有在主線程中,才能刷新UI
###消息隊列機制
* 主線程建立時,系統會同時建立消息隊列對象(MessageQueue)和消息輪詢器對象(Looper)
* 輪詢器的做用,就是不停的檢測消息隊列中是否有消息(Message)
* 消息隊列一旦有消息,輪詢器會把消息對象傳給消息處理器(Handler),處理器會調用handleMessage方法來處理這條消息,handleMessage方法運行在主線程中,因此能夠刷新ui
* 總結:只要消息隊列有消息,handleMessage方法就會調用
* 子線程若是須要刷新ui,只須要往消息隊列中發一條消息,觸發handleMessage方法便可
* 子線程使用處理器對象的sendMessage方法發送消息