获取网络图片
- 网络图片必须要有网络权限才可以,添加网络权限
- 请求图片是一个耗时操作,主线程是不允许进行耗时操作的,以免造成ANR,所以我们需要开启一个线程去请求网络图片,获取到图片发送到主线程进行显示
- 主线程进行图片显示的处理
这个就是我们获取网络图片的三大步,中间的细枝叶我们在慢慢添加
- 添加网络权限,代码如下
- <uses-permission android:name="android.permission.INTERNET"/>
第二步,子线程去请求获得网络图片
/**
* 获取网络文本的线程,耗时操作需要在子线程操作
* @author user
*
*/
public class GetPicThread implements Runnable{
private String path = null;
//handler --用于将数据放送到主线程中
private Handler hander = null;
public GetPicThread(String path, Handler hander) {
super();
this.path = path;
this.hander = hander;
}
@Override
public void run() {
HttpURLConnection conn= null;
InputStream is= null;
InputStreamReader istr= null;
BufferedReader br= null;
try {
//1.定义一个URL对象
URL url = new URL(path);
//2.通过url获取一个HttpURLConnection对象
conn = (HttpURLConnection) url.openConnection();
//3.设置请求方式
conn.setRequestMethod("GET");
//4.设置超时时间
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
//5.判断响应码200
if (conn.getResponseCode() ==
HttpURLConnection.HTTP_OK) {
//6.获取到网络输入的字符流
is = conn.getInputStream();
//7.将字节流中获取的图片数据获取出来
//借助位图工厂类的方法,将流转换为图
Bitmap bm = BitmapFactory.decodeStream(is);
//8.将获取的数据发送到主线程中去
Message msg = hander.obtainMessage();
msg.what = 0x0001;
msg.obj = bm;
hander.sendMessage(msg);
}
//9.释放资源
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(br != null){
br.close();
}
if(istr != null){
istr.close();
}
if(is!= null){
is.close();
}
if(conn!= null){
conn.disconnect();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
第三步主线程接收到子线程发送过来的消息进行处理显示
———-“
public class MainActivity extends Activity {
private ImageView main_iv_show;
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (msg.what == 0x0001) {
Bitmap bm = (Bitmap) msg.obj;
main_iv_show.setImageBitmap(bm);
}
return false;
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
main_iv_show = (ImageView) findViewById(R.id.main_image_show);
}
/**
* 定义button的点击监听事件
* 写法格式固定,方法名要参考xml布局中onclick的属性值
* @param v
*/
public void getPic(View v){
String path = "http://img4.duitang.com/uploads/item/201502/01/20150201163209_NNruz.jpeg";
//创建一个线程对象
GetPicThread gpt = new GetPicThread(path, handler);
Thread t = new Thread(gpt);
t.start();
}
}
我们去请求图片的时候,一定线验证链接地址是否正确,是否是图片的链接地址,否则其它的一概免谈
布局文件如下所示
<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:orientation="vertical"
tools:context="com.example.getpic3.MainActivity" >
<Button
android:id="@+id/main_btn"
android:onClick="getPic"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取网络图片"/>
<ImageView
android:id="@+id/main_image_show"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>