使用HttpURLConnection實現圖片的下載與現顯示
雖然我們在開發中經常使用別人已經開發好的開源框架,但是,了解這些框架底層的實現,能夠讓我們更好的理解功能的實現。
這篇文章主要介紹使用HttpURLConnection對象,實現圖片文件的下載,以及顯示。
我們的思路是,首先使用HttpURLConnection實現圖片文件的下載,在下載結束之后,使用handler異步的顯示圖片。
public class MainActivity extends Activity { private Context mContext; private ImageView image; // 加載成功 private static final int LOAD_SUCCESS = 1; // 加載失敗 private static final int LOAD_ERROR = -1; // 用于異步的顯示圖片 private Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { //下載成功 case LOAD_SUCCESS: // 獲取圖片的文件對象 File file = new File(Environment.getExternalStorageDirectory(), "pic.jpg"); FileInputStream fis = null; try { fis = new FileInputStream(file); Bitmap bitmap = BitmapFactory.decodeStream(fis); image.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } break; //下載失敗 case LOAD_ERROR: Toast.makeText(mContext, "加載失敗", 0).show(); break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; setContentView(R.layout.activity_main); image = (ImageView) findViewById(R.id.image); } // Button的點擊事件 public void show(View view) { // 開啟新的線程用于下載圖片 new Thread(new Runnable() { public void run() { getPicture(); } }).start(); } //下載圖片的主方法 private void getPicture() { URL url = null; InputStream is = null; FileOutputStream fos = null; try { //構建圖片的url地址 url = new URL("http://avatar.csdn.net/C/6/8/1_bz419927089.jpg"); //開啟連接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //設置超時的時間,5000毫秒即5秒 conn.setConnectTimeout(5000); //設置獲取圖片的方式為GET conn.setRequestMethod("GET"); //響應碼為200,則訪問成功 if (conn.getResponseCode() == 200) { //獲取連接的輸入流,這個輸入流就是圖片的輸入流 is = conn.getInputStream(); //構建一個file對象用于存儲圖片 File file = new File(Environment.getExternalStorageDirectory(), "pic.jpg"); fos = new FileOutputStream(file); int len = 0; byte[] buffer = new byte[1024]; //將輸入流寫入到我們定義好的文件中 while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } //將緩沖刷入文件 fos.flush(); //告訴handler,圖片已經下載成功 handler.sendEmptyMessage(LOAD_SUCCESS); } } catch (Exception e) { //告訴handler,圖片已經下載失敗 handler.sendEmptyMessage(LOAD_ERROR); e.printStackTrace(); } finally { //在最后,將各種流關閉 try { if (is != null) { is.close(); } if (fos != null) { fos.close(); } } catch (Exception e) { handler.sendEmptyMessage(LOAD_ERROR); e.printStackTrace(); } } } }
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!