虽然我们在开发中经常使用别人已经开发好的开源框架,但是,了解这些框架底层的实现,能够让我们更好的理解功能的实现。
这篇文章主要介绍使用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" />