標籤:
1 public void viewImage(View view) 2 { 3 String path=etImageUrl.getText().toString();//把圖片路徑轉換成字串 4 if(TextUtils.isEmpty(path)) 5 { 6 /* 7 * question:對於一個UI介面中,當判斷使用者是否輸入使用者名稱或密碼時,我們常用TextUtils.isEmpty()方法來判斷;但有時也可以用這個equals()方法,都可以來判斷EditText中是否為空白,但有時很糾結,不知道這兩種方法中哪個比較好?為什嗎?*/ 8 answer:仔細讀官方的API: Returns true if the string is null or 0-length. 9 因為你從EditText返回的是一個變數。如果這個變數本身為null值,那麼你掉它的equals方法是要報錯的。但是如果你調用TextUtils.isEmpty() 把這個變數作為參數傳進去。10 只要這個參數為空白或者為"",都會返回真。所以,用官方給的更加嚴謹。而且,也十分方便。因為你單獨去判斷你還不是要寫一個if語句判斷。返回的還是一個boolean值*/11 12 Toast.makeText(this, R.string.NOnull, Toast.LENGTH_LONG).show();//如果輸入路徑為空白,就彈出Toast13 }else{14 //不為空白,串連伺服器,請求獲得圖片15 try{16 URL url=new URL(path);17 //發出http請求18 HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection();19 httpURLConnection.setRequestMethod("GET");//設定提交方式20 //設定連線逾時時間21 httpURLConnection.setConnectTimeout(5000);//這時,我們設定為逾時時間為5秒,如果5秒內不能串連就被認為是有錯誤發生.22 int responsecode=httpURLConnection.getResponseCode();23 if(responsecode==200){24 InputStream inputstream=httpURLConnection.getInputStream();25 Bitmap bitmap=BitmapFactory.decodeStream(inputstream);26 ivImage.setImageBitmap(bitmap);27 }else{28 Toast.makeText(this, R.string.error, Toast.LENGTH_LONG).show();29 }30 }catch(MalformedURLException e){31 e.printStackTrace();32 }catch(IOException E){33 E.printStackTrace();34 }35 36 }
UI線程
說了那麼多的UI線程,那麼哪些屬於UI線程呢?
UI線程主要包括如下:
-
Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick(),etc
-
AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel,etc
-
Mainthread handler: handleMessage(), post*(runnable r), etc
所以,應該對該演算法進行改進,這就引入了線程的概念,關於線程,在ASP.NET或者java中應該都有詳細解釋。下面不再進行詳細贅餘。
什麼是進程? 當一個程式開始運行時,它就是一個進程,進程包括運行中的程式和程式所使用到的記憶體和系統資源。 而一個進程又是由多個線程所組成的。
什麼是線程? 線程是程式中的一個執行流,每個線程都有自己的專有寄存器(棧指標、程式計數器等),但代碼區是共用的,即不同的線程可以執行同樣的函數。
什麼是多線程? 多線程是指程式中包含多個執行流,即在一個程式中可以同時運行多個不同的線程來執行不同的任務,也就是說允許單個程式建立多個並存執行的線程來完成各自的任務。
多線程的好處: 可以提高CPU的利用率。在多線程程式中,一個線程必須等待的時候,CPU可以運行其它的線程而不是等待,這樣就大大提高了程式的效率。
多線程的不利方面: 線程也是程式,所以線程需要佔用記憶體,線程越多佔用記憶體也越多; 多線程需要協調和管理,所以需要CPU時間跟蹤線程; 線程之間對共用資源的訪問會相互影響,必須解決競用共用資源的問題; 線程太多會導致控制太複雜,最終可能造成很多Bug。
改進後的程式:(採用的是匿名內部類的方法)
1 public void viewImage(View view){ 2 final String imageUrl=etImageUrl.getText().toString(); 3 if(TextUtils.isEmpty(imageUrl)){ 4 Toast.makeText(this, "圖片路徑不可為空", Toast.LENGTH_LONG).show(); 5 }else{ 6 new Thread(){ 7 8 public void run() { 9 try { //在處理的過程中,必須進行異常處理10 URL url=new URL(imageUrl);11 HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection();12 httpURLConnection.setRequestMethod("GET");13 httpURLConnection.setConnectTimeout(5000);14 int responseCode=httpURLConnection.getResponseCode();15 if(responseCode==200){16 InputStream inputStream=httpURLConnection.getInputStream();17 Bitmap bitmap=BitmapFactory.decodeStream(inputStream);18 Message message=new Message();19 message.what=SHOWIMAGE;20 message.obj=bitmap;21 //ivImage.setImageBitmap(bitmap);22 handler.sendMessage(message);23 }else{24 Toast.makeText(MainActivity.this, "顯示圖片失敗", Toast.LENGTH_LONG).show();25 }26 } catch (MalformedURLException e) {27 e.printStackTrace();28 } catch (IOException e) {29 e.printStackTrace();30 }31 32 }33 }.start();34 35 }36 }
在文字框中輸入圖片的路徑,點擊瀏覽按鈕的同時,將會在上方的ImageView中顯示出來該圖片。
想要實現上面的程式,需要在按鈕的點擊事件中,在MainActivity的初始代碼:
網路查看圖片