【Android】使用HttpURLConnection异步发送Http请求并使用Handler线程通信修改UI线程

文章目录

  • 一、封装Http请求
  • 二、使用线程类的Demo

一般我们发送http请求时都会另外开一个线程使用异步的方法,但是存在子线程不能直接修改ui线程内容的问题,所以就要用到线程间的通信,最近刚刚接触这一方面的东西,于是写了一个功能非常简单发送Http请求的类,使用了Thread、Handler、HttpURLConnection来实现了http请求并将获取到的内容拿到UI线程中。在此记录一下。

一、封装Http请求

自定义线程类,通过继承Thread实现。

package com.example.school;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Guanzhou·Chen on 2019/5/9.
 */

public class HttpTool extends Thread {

    public static final int MODE_GET = 101;
    public static final int MODE_POST = 102;

    private int message_what;
    private int current_mode;

    private String str_url;
    private String data = "";
    private HashMap<String, String> param = new HashMap<String, String>();

    private Handler handler;

    /**
     * @param MODL         选择POST或GET方式,HttpTool.MODE_GET / HttpTool.MODE_POST
     * @param url          发送http请求的url,包括ip后的router
     * @param message_what 使用Handler时,分辨消息的message.what
     */
    HttpTool(int MODL, String url, int message_what, Handler handler) {
        current_mode = MODL;
        str_url = url;
        this.message_what = message_what;
        this.handler = handler;
    }

    /**
     * 清空要发送的数据
     */
    public void clearData() {
        data = "";
        param.clear();
    }

    /**
     * @param key   要发送数据的key值
     * @param value 要发送数据的value值
     */
    public void addData(String key, String value) {
        if (current_mode == MODE_GET) {
            addGETData(key, value);
        } else {
            addPOSTData(key, value);
        }
    }

    private void addGETData(String key, String value) {
        if (!data.equals("")) {
            data = data + "&";
        } else {
            data = "?";
        }
        data = data + key + "=" + value;
    }

    private void addPOSTData(String key, String value) {
        param.put(key, value);
    }


    private String getDataString(HashMap<String, String> params) throws Exception {
        StringBuilder result = new StringBuilder();
        boolean first = true;
        for (Map.Entry<String, String> entry : params.entrySet()) {
            if (first)
                first = false;
            else
                result.append("&");
            result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
        }
        return result.toString();
    }

    private void sendMessage(Object obj) {

        Looper.prepare();

        handler.removeMessages(message_what);    //清空消息队列
        Message message = handler.obtainMessage(message_what, 1, 1, obj);
        handler.sendMessage(message);
//        Looper.loop();
    }


    @Override
    public void run() {
        try {
            URL url = new URL(str_url + data);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(5000);
            if (current_mode == MODE_GET) {

                connection.setRequestMethod("GET");
                connection.connect();
            } else {

                byte[] postData = getDataString(param).getBytes(StandardCharsets.UTF_8);

                connection.setRequestMethod("POST");
                connection.setInstanceFollowRedirects(false);
                connection.setReadTimeout(5000);
                connection.setDoOutput(true);
                connection.setUseCaches(false);
                connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                connection.setRequestProperty("charset", "utf-8");
                connection.setRequestProperty("Content-Length", Integer.toString(postData.length));
                DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
                wr.write(postData);
            }
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {

                InputStreamReader in = new InputStreamReader(connection.getInputStream());
                BufferedReader buffer = new BufferedReader(in);

                String inputLine;
                String resultData = "";
                while (((inputLine = buffer.readLine()) != null))
                    resultData += inputLine + "\n";
                in.close();
                Log.d("RESPONSE", resultData);
                sendMessage(resultData);
            }
            connection.disconnect();

        } catch (Exception e) {
            Log.d("ERROR", e.toString());

        }
    }


}

二、使用线程类的Demo

package com.example.school;

import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
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.TextView;

import java.lang.ref.WeakReference;

public class MainActivity extends AppCompatActivity {

    private static final int MESS_WHAT_TEST_POST = 301;
    private static final int MESS_WHAT_TEST_GET = 302;


    private HttpTool httpTool;
    private Button test_POST;
    private Button test_GET;


    final Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg){
            super.handleMessage(msg);
            System.out.println(msg);

            switch (msg.what) {
                case MESS_WHAT_TEST_POST:
                    test_POST.setText(msg.obj.toString());
                    break;
                case MESS_WHAT_TEST_GET:
                    test_GET.setText("SUCC");
                    break;
                default:
                    break;
            }
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        test_GET = (Button) findViewById(R.id.test_GET);
        test_POST = (Button) findViewById(R.id.test_POST);



        test_POST.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                httpTool = new HttpTool(HttpTool.MODE_POST, "http://129.211.28.150:8443/api/loginInUsername", MESS_WHAT_TEST_POST, handler);

                httpTool.clearData();
                httpTool.addData("userName", "201626811302");
                httpTool.addData("password", "123456");

                httpTool.start();
            }
        });

        test_GET.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                httpTool = new HttpTool(HttpTool.MODE_GET, "http://129.211.28.150:8443/api/getStopPosition", MESS_WHAT_TEST_GET, handler);

                httpTool.clearData();
                httpTool.addData("lat","30.22");
                httpTool.addData("lng","120.03");

                httpTool.start();
            }
        });
    }
    @Override
    protected void onDestroy(){
        super.onDestroy();
        httpTool.stop();
    }

}

你可能感兴趣的:(Android)