安卓基础:HTTP连接网络初识

HTTP连接网络

一.HTTP初识

1.HTTP协议简介:

HTTP (Hypertext Transfer Protocol )”超文本传输协议”,是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种协议。

2.Get与Post的主要区别

简单来说:Get与Post就是基于http协议的网络数据交互方式。

1.Get请求属于明文传参,地址栏可以看见参数,调用简单不安全数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
POST把提交的数据则放置在是HTTP包的包体中。
- 2.get是把参数数据队列加到表单的 ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到,实际上就是URL拼接方式。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。
- 3.get 传送的数据量较小,不能大于1KB[IE,Oher:4]。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
- 4.get安全性非常低,post安全性较高。

二.使用HTTP完成网络连接的步骤

1.我们使用一个简单的例子:在点击按钮后访问完成连接,并在控制台打印一句话。

这里写图片描述
这里写图片描述

  • 步骤一. 创建URL对象

这里写图片描述

创建一个连接网络的方法getWeb()

  private void getWeb() {
      /*  URL url=new URL("https://www.baidu.com/");需要异常处理*/
        try {
            URL url=new URL("https://www.baidu.com/");
            HttpURLConnection connection= (HttpURLConnection) url.openConnection();
            InputStream inputStream=connection.getInputStream();
            InputStreamReader inputStreamReader=new InputStreamReader(inputStream);
            BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
            String temp="";
            StringBuffer stringBuffer=new StringBuffer();
            while ((temp=bufferedReader.readLine())!=null){
                stringBuffer.append(temp);
            }
            Log.d("连接成功------------------", "getWeb: ");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

在按钮的点击事件中调用

  btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                    getWeb();
                    }
                }).start();
            }
        });

注意: 最后需要在注册文件中添加请求

这里写图片描述

注意:

- URL url=new URL(“https://www.baidu.com/“); URL的书写格式”/”结束。

- 单击事件中要创建一个子线程,访问网络也属于耗时操作,不可以在主线程中进行。

2.实现网络图片的访问

点击访问图片按钮
这里写图片描述

package com.example.a22120.day5_http_class;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.nfc.Tag;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
   private Button btn,btn_img;
    private  ImageView image_http;
    Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //使用handler实现在主线程中更新UI的操作
         handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                Bitmap bi= (Bitmap) msg.obj;
                image_http.setImageBitmap(bi);
            }
        };
        btn=findViewById(R.id.fw);
        btn_img=findViewById(R.id.btn_tp);
        image_http=findViewById(R.id.img_http);
        btn_img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        getWebImg();
                    }
                }).start();

            }
        });

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                    getWeb();
                    }
                }).start();
            }
        });
    }

    //访问网络图片的方法
    private void getWebImg() {
        try {
         URL url=new URL("http://img1.imgtn.bdimg.com/it/u=4054610911,701962612&fm=27&gp=0.jpg");
            HttpURLConnection  httpURLConnection= (HttpURLConnection) url.openConnection();
            InputStream inputStream=httpURLConnection.getInputStream();
            Bitmap bitmap=BitmapFactory.decodeStream(inputStream); //bitmapFactory  birmap加工厂

            Message message=handler.obtainMessage();
            message.obj=bitmap;
            handler.sendMessage(message);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private void getWeb() {
      /*  URL url=new URL("https://www.baidu.com/");需要异常处理*/
        try {
            URL url=new URL("https://www.baidu.com/");
            HttpURLConnection connection= (HttpURLConnection) url.openConnection();
            InputStream inputStream=connection.getInputStream();
            InputStreamReader inputStreamReader=new InputStreamReader(inputStream);
            BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
            String temp="";
            StringBuffer stringBuffer=new StringBuffer();
            while ((temp=bufferedReader.readLine())!=null){
                stringBuffer.append(temp);
            }
            Log.d("连接成功------------------", "getWeb: ");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

UI代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.a22120.day5_http_class.MainActivity">
    <Button
    android:layout_width="match_parent"
    android:text="访问网络"
    android:id="@+id/fw"
    android:layout_height="wrap_content" />
    <Button
        android:layout_width="match_parent"
        android:text="访问网络图片"
        android:id="@+id/btn_tp"
        android:layout_height="wrap_content" />
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:id="@+id/img_http"/>
</LinearLayout>

三.String StringBuffer StringBuilder有什么区别

String

字符串常量,String 是不可变的对象

StringBuffer

字符串变量(线程安全,多线程下操作大量的数据用StringBuffer)
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。

扫描二维码关注公众号,回复: 3199229 查看本文章

StringBuilder

字符串变量(非线程安全,单线程下操作大量的数据就使用StringBuilder)

在执行速度上:StringBuilder–>StringBuffer–>String

String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象。StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。

猜你喜欢

转载自blog.csdn.net/qq_38845493/article/details/80640532