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

获取网络图片

  • 网络图片必须要有网络权限才可以,添加网络权限
  • 请求图片是一个耗时操作,主线程是不允许进行耗时操作的,以免造成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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值