android 原生AsyncTask异步任务封装网络请求

前言:

最近在做安卓新项目 但是要用到老技术 有点尴尬哈 因为之前手写的网络框架都是开一个线程然后用handler来实现线程之前的通信 现在我改了用 AsyncTask 来实现:

效果图

image.png

image.png

具体实现:

  • 网络连接

package com.example.myapplication.http;
import android.text.TextUtils;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
/**
 * Created by xuqing on Date: 2022/11/2
 */
public class NetWorkRequest {
    private int dkpdpConnectTime =10000;
    private int dkpdpReadTime =10000;

    /**
     * ch
     * @param requestUrl
     * @param requestMethod
     */
    public NetResponse qecrnNetWordRequst(String requestUrl, String requestMethod, String contextType, String body, Map<String, String> headerMap){
        HttpURLConnection connection = null;
        try {
            URL url = new URL(requestUrl);
            connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(dkpdpConnectTime);
            connection.setReadTimeout(dkpdpReadTime);
            connection.setRequestMethod(requestMethod);
            connection.setDoInput(true);//可读入
            connection.setDoOutput(true);//可写出
            connection.setUseCaches(false);//不缓存
            if(!TextUtils.isEmpty(contextType)){
                connection.setRequestProperty("Content-Type", contextType);
            }
            if(headerMap!=null && headerMap.size()>0){
                for (String key:headerMap.keySet()){
                    connection.setRequestProperty(key,headerMap.get(key));
                }
            }
            connection.connect();//建立连接
            if(!TextUtils.isEmpty(body)){
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(),"UTF-8"));
                if(writer!=null){
                    writer.write(body);
                    writer.close();
                }
            }
            return qecrnGetNetResponse(connection);
        } catch (Throwable e) {
            e.printStackTrace();
            return qecrnExceptionResponse(connection,e);
        }

    }

    /**
     * 正常返回,获取response 对象
     * @param conn
     * @return
     */
    private NetResponse qecrnGetNetResponse(HttpURLConnection conn){
        NetResponse response = new NetResponse();
        try {
            if(conn == null){
                return null;
            }
            response.dkpdpResponseCode = conn.getResponseCode();

            if(response.dkpdpResponseCode == HttpURLConnection.HTTP_OK){
                response.dkpdpResponseContent = qecrnGetResponeString(conn.getInputStream());
                response.dkpdpResponseCode = 200;//强制修改为200,判断200为成功接收就好了。
            }else{
                response.dkpdpResponseContent = qecrnGetResponeString(conn.getErrorStream());
            }
        } catch (Throwable e) {
            response.dkpdpResponseCode = -1;
            response.dkpdpResponseContent = e.getMessage();
            e.printStackTrace();
        }
        return response;
    }

    /**
     * 异常返回,获取response 对象
     * @param conn
     * @param e
     * @return
     */
    private NetResponse qecrnExceptionResponse(HttpURLConnection conn, Throwable e){
        if(conn != null){
            conn.disconnect();
        }
        if(e == null){
            return null;
        }
        e.printStackTrace();
        NetResponse response = new NetResponse();
        response.dkpdpResponseCode = -2;
        response.dkpdpResponseContent = e.getMessage();
        return response;
    }

    private String qecrnGetResponeString(InputStream is){
        String buf;
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
            StringBuilder sb = new StringBuilder();
            String line = "";
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            buf = sb.toString();
            return buf;

        } catch (Throwable e) {
            return "";
        }

    }
}

异步任务 GET

package com.example.myapplication.http;
import android.annotation.SuppressLint;
import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.Log;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;




/**
 * Created by kunge hu on 2016/11/1.
 */
public class GetTask extends AsyncTask<Void, Void, String> {
    private static final String TAG = "GetTask";
    private HttpRequestCallBack listener;
    private String url;
    private Map<String, String> getmapparams;
    private String type;


    /**
     *
     * @param url
     * @param listener
     */
    public GetTask( String url,HttpRequestCallBack listener) {
        this.listener = listener;
        this.url = url;
    }
    /***
     *
     * @param url
     * @param type
     * @param getmapparams
     * @param listener
     */
    public GetTask(final String url, final String type, final Map<String, String> getmapparams, HttpRequestCallBack listener) {
        this.url = url;
        this.listener = listener;
        this.getmapparams=getmapparams;
        this.type=type;
    }

    @SuppressLint("NewApi")
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    @Override
    protected String doInBackground(Void... params) {
        try {
            String geturl="";
            if(getmapparams!=null){
                geturl= RequestUtil.clwuyGetUrl(url,getmapparams);
            }else{
                geturl=url;
            }
            NetWorkRequest request = new NetWorkRequest();
            Map<String, String> headerMap=new HashMap<>();
            headerMap.put("x-method","get");
            headerMap.put("x-request",type);
            String contextType="application/json;charset=utf-8";
            NetResponse response =request.qecrnNetWordRequst(geturl,"GET",contextType,"",headerMap);
            Log.e(TAG, "doInBackground:response "+response.dkpdpResponseContent );

            if(response.dkpdpResponseCode==200){
                return  response.dkpdpResponseContent;
            }else{
                return null;
            }

        } catch (Exception e) {
            Log.e("kunge.hu", "GetTask Exception:" + e.toString());
        }
        return null;
    }
    @SuppressLint("NewApi")
    @Override
    protected void onPostExecute(String t) {

        try {
            if(!TextUtils.isEmpty(t)){
                JSONObject jsonObject=new JSONObject(t);
                listener.clwuyHttpCallBackListener(t);
              }else{
                Log.e(TAG, "onPostExecute: "+"网络服务器失败" );
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

异步任务post

package com.example.myapplication.http;

import android.annotation.SuppressLint;
import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.Log;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;

/**
 * 作者:xuqing
 * 时间:
 * 邮箱:1693891473@qq.com
 * 说明:post请求异步任务
 */
public class PostTask extends AsyncTask<Void, Void, String> {
    private static final String TAG = "GetTask";
    private HttpRequestCallBack listener;
    private String url;
    private Map<String, String> getmapparams;
    private String type;


    public PostTask(final String url,   HttpRequestCallBack listener) {
        this.url = url;
        this.listener = listener;
    }

    public PostTask(final String url, final String type, final Map<String, String> getmapparams, HttpRequestCallBack listener) {
        this.url = url;
        this.listener = listener;
        this.getmapparams=getmapparams;
        this.type=type;
    }

    @SuppressLint("NewApi")
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    @Override
    protected String doInBackground(Void... params) {
        try {
            String body="";
            if(getmapparams!=null){
                body= RequestUtil.clwuyGetPostBodyFormParameMap(getmapparams);
            }

            NetWorkRequest request = new NetWorkRequest();
            Map<String, String> headerMap=new HashMap<>();
            headerMap.put("x-method","post");
            headerMap.put("x-request",type);
            String contextType="application/json;charset=utf-8";
            NetResponse response =request.qecrnNetWordRequst(url,"POST",contextType,body,headerMap);
            Log.e(TAG, "doInBackground:response "+response.dkpdpResponseContent );
            if(response.dkpdpResponseCode==200){
                return  response.dkpdpResponseContent;
            }else{
                return null;
            }

        } catch (Exception e) {
            Log.e("kunge.hu", "GetTask Exception:" + e.toString());
        }
        return null;
    }
    @SuppressLint("NewApi")
    @Override
    protected void onPostExecute(String t) {

        try {
            if(!TextUtils.isEmpty(t)){
                JSONObject jsonObject=new JSONObject(t);
                listener.clwuyHttpCallBackListener(t);
            }else{
                Log.e(TAG, "onPostExecute: "+"网络服务器失败" );
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

对外层调用方法

package com.example.myapplication.http;
import java.util.Map;


/**
 * 作者:xuqing
 * 时间:2023年11月28日10:17:12
 * 邮箱:1693891473@qq.com
 * 说明:对外层调用的方法
 */
public class NetCtrl {
    public static void get(final String url,  HttpRequestCallBack listener) {
        new GetTask(url, listener).execute();
    }
    public static void get(final String url, final String type, final Map<String, String> params, HttpRequestCallBack listener) {
        new GetTask( url,type, params, listener).execute();
    }
    public static  void post(final String url, HttpRequestCallBack listener){
        new PostTask( url, listener).execute();
    }
    public static  void post(final String url, final String type,
                             final Map<String, String> params, HttpRequestCallBack listener){
        new PostTask( url,type, params, listener).execute();
    }
}

在MainActivity测试请求

  • get

        //带请求参数
        NetCtrl.get(url, "", null, new HttpRequestCallBack() {
            @Override
            public void clwuyHttpCallBackListener(String result) {
                Log.e(TAG, "clwuyHttpCallBackListener: result-- >"+result );

            }
            @Override
            public void clwuyHttpRequestFail(String errorString, int code) {
            }
        });


        //不带请求参数
        NetCtrl.get(url, new HttpRequestCallBack() {
            @Override
            public void clwuyHttpCallBackListener(String result) {
                Log.e(TAG, "clwuyHttpCallBackListener: result-- >"+result );

            }
            @Override
            public void clwuyHttpRequestFail(String errorString, int code) {
            }
        });

  • post

  NetCtrl.post(url, "", null, new HttpRequestCallBack() {
            @Override
            public void clwuyHttpCallBackListener(String result) {
                Log.e(TAG, "post clwuyHttpCallBackListener: result-- >"+result );

            }
            @Override
            public void clwuyHttpRequestFail(String errorString, int code) {
            }
        });
        NetCtrl.post(url, new HttpRequestCallBack() {
            @Override
            public void clwuyHttpCallBackListener(String result) {
                Log.e(TAG, "clwuyHttpCallBackListener: "+"result  -- >  " +result );


            }

            @Override
            public void clwuyHttpRequestFail(String errorString, int code) {

            }
        });

项目地址:

码云 :https://gitee.com/qiuyu123/async-taskdemo

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容