虽然我们在开发中经常使用别人已经开发好的开源框架,但是,了解这些框架底层的实现,能够让我们更好的理解功能的实现。
这篇文章主要介绍使用HttpURLConnection对象,实现图片文件的下载,以及显示。
我们的思路是,首先使用HttpURLConnection实现图片文件的下载,在下载结束之后,使用handler异步的显示图片。
因为功能比较简单,我只把代码贴在下面,注释很详细
/** * 使用HttpURLConnection实现图片的下载与现显示 * * @author ZhaoKaiQiang * @time 2014年6月9日 */ 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(); } } } }
布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <ImageView android:id="@+id/image" android:layout_width="150dp" android:layout_height="150dp" android:scaleType="centerCrop" /> <Button android:onClick="show" android:layout_width="100dp" android:layout_height="100dp" android:text="显示" /> </LinearLayout>
运行结果
不要忘记添加权限
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />