欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HttpURLConnection的简单应用和String,Stringbuffer,StringBulder的区别

程序员文章站 2022-04-19 17:37:13
...

HTTP请求
HttpURLConnection类:

get和post两种方式的区别:

get:明文传参,不加密:?url的连接符
post:地址栏参数是不可见,密码一般设置为post方式

HttpURLConnection请求网络数据实例:

因为请求网络数据是一个耗时操作(对于计算机而言几秒的运算也是耗时操作),所以需要开启一个线程,在子线程中做耗时操作,所以要在单击事件中添加一个线程用于请求网络数据,线程代码如下:

 public void onClick(View v) {
        switch (v.getId()) {
             //请求网络数据按钮的单击事件
            case R.id.web_btn:
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //getWenInfo();
                        getwbImg();
                    }
                }).start();
                //请求网络图片的按钮的单击事件
            case R.id.web_imgbtn:
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                    //调用请求网络数据的方法
                        getWenInfo();
                        //调用请求网络图片的方法
                        getwbImg();
                    }
                }).start();

        }

写一个方法getWenInfo();

private void getWenInfo() {
        try {
            //创建url地址对象
            URL url = new URL("https://hao.360.cn/?safe");
            //创建connection对象
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            //创建输入流对象
            InputStream sream = connection.getInputStream();
            //创建Reader对象
            InputStreamReader reader = new InputStreamReader(sream);
            //创建BufferedReader对象
            BufferedReader bufferedrader = new BufferedReader(reader);
            //开始读取
            String temp = "";
            StringBuffer stringbuffer = new StringBuffer();
            while ((temp = bufferedrader.readLine()) != null) {
                stringbuffer.append(temp);
                Log.e(stringbuffer.toString(), "zzzzz");
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

HttpURLConnection加载网络图片实例:

这里要通过handler.obtainMessage()给主线程发送消息要用到之前所学习的handler
实例化handler并且用handleMessage接收子线程发送的消息

 private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Bitmap btp= (Bitmap) msg.obj;
            //图片是Bitmap型的所以要用Bitmap接收 
            image1_web.setImageBitmap(btp);
        }
    };

请求网络图片的方法:

private void getwbImg() {
        try {
                    //创建url地址对象
            URL url=new URL("https://ps.ssl.qhimg.com/sdmt/116_135_100/t011c7730ab0e185e71.jpg");
                  //创建connection对象
            HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                   //创建输入流对象
            InputStream inputStream=connection.getInputStream();
                 //
            Bitmap bitmap= BitmapFactory.decodeStream(inputStream);
                //通过调用handler.obtainMessage()实例化message
            Message message=handler.obtainMessage();
               //用obj接收其所传的图片
            message.obj=bitmap;
            //发送消息
            handler.sendMessage(message);

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

String,Stringbuffer,StringBulder的区别与联系

String:创建多个对象,零散的,是不可变的;串联的效率最慢
Stringbuffer:创建一个对象,是可变的:多线程安全的
StringBulder:单线程下字符串的串联;是可变的;是线程不安全的(StringBuffer的append操作用了synchronized)

String:

是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:

是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
注意:不能通过赋值符号对他进行赋值.
sb = “welcome to here!”;//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中赋值的时候可以通过它的append方法.
sb.append(“hello”);
字符串连接操作中StringBuffer的效率要比String高:
String str = new String(“welcome to “);
str += “here”;
的处理步骤实际上是通过建立一个StringBuffer,然后调用append(),最后
再将toSting(), 这样String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣。并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值, 这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的。

StringBuilder:

StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。

执行速度方面的比较:StringBuilder > StringBuffer > String

对于三者使用的总结:

如果要操作少量的数据用 = String
单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
多线程操作字符串缓冲区 下操作大量数据 = StringBuffer