好久没写教程了,上上个星期辞职了,怕没手感了,特再写一个入门级教程练练手同时供大家学习。
Android显示网络图片一般都是将网络连接得到的输入流转为化位图对象(Bitmap),再将这个对象交给ImageView对象或其他控件显示。相信大家对ImageView显示网络图片的方法已经很了解了,百度教程也一大把(大多没有谈及异步线程有关的问题),主要分为基础的Java网络请求方式和类似Universal-Image-Loader第三方包(库)方式,笔者认为后者大概是较好的封装前者方式的包(库),个人比较喜欢越基础的越好,太依赖第三方会造成懒惰和依赖心理,技术也很难提升。话不多说,上教程:
1.本教程以RelativeLayout为例,activity_main.xml里--->
这个很简单,没什么好解释的了。
2.MainActivity里编写相关逻辑—>
定义一个子线程内部类,具体逻辑和注释已经很详细了。
/**
* 显示背景图片的内部类子线程
* @author Cheny
*/
private class ShowNetPicThread implements Runnable {
@Override
public void run() {
try {
// 图片地址,这里是百度获得链接,如果不能显示图片(链接失效)请再百度个链接
String urlStr = "http://b.hiphotos.baidu.com/zhidao/pic/item/6d81800a19d8bc3e9027b816838ba61ea8d3453a.jpg";
// 将图片地址转化为URL对象
URL picUrl = new URL(urlStr);
// 获取连接网络的对象(HTTP协议)
HttpURLConnection connection = (HttpURLConnection) picUrl.openConnection();
// 设置连接超时时间,5秒
connection.setConnectTimeout(5000);
// 设置连接获取输入流
connection.setDoInput(true);
// 设置连接使用缓存
connection.setUseCaches(true);
// 连接网络,貌似可写可不写
connection.connect();
// 获取连接后的输入流
InputStream is = connection.getInputStream();
// 将该输入流转化为Bitmap对象
final Bitmap bitmap = BitmapFactory.decodeStream(is);
// 这里是子线程,需要回归主线程更新UI
runOnUiThread(new Runnable() {
public void run() {
// 将Bitmap对象转换为Drawable对象
Drawable pic = new BitmapDrawable(bitmap);
// 设置rl_content背景
rl_content.setBackground(pic);
}
});
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
OK,是不是觉得和ImageView显示网络图片的方式很像?实际上区别不大,只是在runOnUiThread里的代码有稍微的不一样,bitmap对象不需要转换为Drawable对象,直接imageView.setImageBitmap(bitmap) (这里的imageView是ImageView对象)就可以了。注意了,这里的runOnUiThread是用来通过主线程(本教程是MainActivity为主线程)操作UI,Android是不允许子线程直接操作UI主线程的。当然这里也可以用AsyncTask,Handler处理,具体方法请大家百度Android AsyncTask,Handler用法。
别忘了配置:<uses-permission android:name="android.permission.INTERNET" />
网络权限哦。
好了就说到这里了,很基础的教程,不喜勿喷。对了,大家有什么好工作(上海公司)也可以推荐给我,待业中。
暂无评论内容