在日常的编写Android软件的过程中,避免不了使用网络请求,也不可能使用单机的Android,所以本次讲的是通过Android发送网络请求请求图片的文章。
我先来总结一下网络请求的几个步骤:
1、将想要请求的图片地址转换成URL类
2、通过openConnection来建立连接
3、在编程的时候我避免让用户死等,设置网络连接的超时时间,读取时间
4、设置请求网络的类型(GET或者POST)
5、提交网络请求
6、接受返回码,通过返回码判断网络是否请求成功
注意:这里非常重要,任何网络请求必须加上网络权限 <uses-permission android:name="android.permission.INTERNET"/>
这些是在网络请求中最基本的几个步骤,在我们写的请求网络图片的代码中,还有其余的代码需要补充。
我们代码一步一步的来:
//将想要请求的图片地址转换成URL类 这个图片的地址有点长
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Monaco; color: #3933ff }
span.s1 { color: #000000 }
span.s2 { color: #931a68 }
URL url = new URL("https://timgsa.baidu.com/timg? image&quality=80&size=b9999_10000&sec=1524759026299&di=47e39d74fe559c7ab60318fb308ab8fa&imgtype=0&src=http%3A%2F%2Fimgstore.cdn.sogou.com%2Fapp%2Fa%2F100540002%2F691448.jpg");
//通过openConnection来建立连接 这里的HttpURLConnection是openConnection的返回类型
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//在编程的时候我避免让用户死等,设置网络连接的超时时间,读取时间
//设置连接超时为5秒
connection.setConnectTimeout(5000);
//设置读取超时为5秒
connection.setReadTimeout(5000);
//设置请求网络的类型(GET或者POST)
connection.setRequestMethod("GET");
//提交网络请求
connection.connect();
//接受返回码 这里接受到的返回码是int类型的
int code = connection.getResponseCode();
//通过返回码判断网络是否请求成功
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Monaco }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Monaco; color: #4e9072 }
span.s1 { color: #931a68 }
span.s2 { color: #000000 }
span.s3 { color: #0326cc }
span.Apple-tab-span { white-space: pre }
if(code == 200){
//获取连接返回的数据流
InputStream is = connection.getInputStream();
//因为返回的是个图片所以通过位图的方式获取
Bitmap bm = BitmapFactory.decodeStream(is);
//设置消息
Message message = new Message();
message.what = 0;
message.obj = bm;
//通过handler发送消息
handler.sendMessage(message);
}
在Android中执行耗时操作必须在子线程中执行,所以这里我们需要一个Handler来在主线程中设置ImageView的图片
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Monaco }
span.s1 { color: #0326cc }
span.s2 { color: #931a68 }
span.s3 { text-decoration: underline }
span.Apple-tab-span { white-space: pre }
Handler handler =new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
//如果msg.what是0 那么保存图片显示到ImageView中
case 0:
//在上面我们发送请求的时候把接受到的图片放到了message中,所以我们这里需要判断是否是相应的数值
//才确定是否接受这个图片
Bitmap bm = (Bitmap) msg.obj;
//设置ImageView图片
imageView.setImageBitmap(bm);
break;
}
};
};
如果说我们的按钮执行请求图片的时,必须在子线程中执行,否则报错;
btnButton这个是按钮
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Monaco }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Monaco; min-height: 21.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Monaco; color: #777777 }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Monaco; color: #4e9072 }
span.s1 { color: #0326cc }
span.s2 { color: #931a68 }
span.s3 { color: #000000 }
span.s4 { color: #91afcb }
span.s5 { color: #4e9072 }
span.Apple-tab-span { white-space: pre }
btnButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//创建子线程
new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
//获取图片
getPic();
}
}.start();
}
});
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Monaco }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Monaco; color: #4e9072 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Monaco }
span.s1 { color: #000000 }
span.Apple-tab-span { white-space: pre }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Monaco }
span.s1 { color: #3933ff }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Monaco }
span.s1 { color: #931a68 }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Monaco; color: #3933ff }
span.s1 { color: #009193 }
span.s2 { color: #4e9192 }
span.s3 { color: #000000 }
span.s4 { color: #932192 }
原文地址:https://www.cnblogs.com/mCarrYoung/p/8955489.html