您的位置:首页 > 理论基础 > 计算机网络

Android开发笔记之get请求方式获得网络图片

2016-07-20 16:39 411 查看
获取网络图片

网络图片必须要有网络权限才可以,添加网络权限

请求图片是一个耗时操作,主线程是不允许进行耗时操作的,以免造成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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: