NetLoader开发文档一类轻松解决网络请求

netLoader基于imageloader参考封装的, 是把线程管理和网络请求封装成一个大类,开发者不用担心线程的维护。只要在ui线程中传进上传的参数即可,网络请求包括get请求,post携带参数上传的请求,post上传文件,post上传参数并且携带文件的,本类中的网络请求部分不携带cookie,开发者请自己进封装类中,找到方法名为load前缀的方法体中进行修改。

好了现在我就开始讲解本类的用法。

1.开发环境

Androidstudio开发人员需要导入okhttp的依赖(注意哦  是两个依赖—上网查询)

Eclipse的用户需要导入okhttp的jar包(注意哦  是两个jar—上网查询)

2.如何使用

首先一个类必须初始化,本类中采用的是单类模式(2种,开发人员自行选择)

第一种:采用本类默认的设置

NetLoader loader =NetLoader.getInstance();(可以在application中进行全局的初始化);

第二种:开发人员自行设置参数

NetLoader loader =NetLoader.getInstance(int threadCount,Type type );

threadCount:代表着线程池中线程的数量

Type:代表执行任务的顺序呢,是本类中的枚举类

Public Type{

FIFO,LIFO;

}

FIFO:先进先出

LIFO:后进先出

开发人员自己设定

建议开发人员直接在application初始化,如果担心该实例会随时被销毁,那么在方法用处直接用单例调用;

3.使用理念

如果用上述2中的第二种方法初始化,那么在用处可以直接用NetLoader.getInstance().load….();开发人员可以放心你设置的参数会保存起来,不用重新设置。

4.网络请求

(1)get请求

NetLoader.getInstance().loadGetData(url,new NetResponseListener() {

                                  

                                   @Override

                                   publicvoid success(String resultString) {

                                          //TODO Auto-generated method stub

                                          tv_net.setText(resultString);

                                          Log.i("tag+成功", resultString);

                                   }

                                  

                                   @Override

                                   publicvoid fail(String failString, Exception e) {

                                          //TODO Auto-generated method stub

                                          Log.i("tag+ 失败", failString);

                                   }

                            });

(2)post带参数的请求(有小瑕疵,只能是string类型的参数,开发人员开一根据需要修改源码还是load方法)

你会看到BasicNameValuePair 这个类

BasicNameValuePair pair = new BasicNameValuePair(String,String);这里是你要上传的参数前面是键后面是值;

然后装入list< BasicNameValuePair>中

再调用

NetLoader.getInstance().loadOrdinaryPostData(url,new NetResponseListener() {

                                  

                                   @Override

                                   publicvoid success(String resultString) {

                                          //TODO Auto-generated method stub

                                         

                                   }

                                  

                                   @Override

                                   publicvoid fail(String failString, Exception e) {

                                          //TODO Auto-generated method stub

                                         

                                   }

                            },list);

(3)post只上传文件

filekeys 是上传文件的键值数组

filePaths 是文件路径的数组

                     NetLoader.getInstance().loadPostFilesData(url,filekeys, filePaths, new NetResponseListener() {

                           

                            @Override

                            publicvoid success(String resultString) {

                                   //TODO Auto-generated method stub

                                  

                            }

                           

                            @Override

                            publicvoid fail(String failString, Exception e) {

                                   //TODO Auto-generated method stub

                                  

                            }

                     });

(4)post上传文件病携带参数(有小瑕疵,只能是string类型的)

       NetLoader.getInstance().loadPostParamsWithFiles(url,filekeys, filePaths, new NetResponseListener() {

                    

                     @Override

                     publicvoid success(String resultString) {

                            //TODO Auto-generated method stub

                           

                     }

                    

                     @Override

                     publicvoid fail(String failString, Exception e) {

                            //TODO Auto-generated method stub

                           

                     }

              },list)

(5)匆忙设置cookie

 

注意事项:

如果开发人员想改代码  只需要改动load。。方法里的网络请求即可

github:https://github.com/nanchaodong/-

package com.wolf.mirror.utils;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

import org.apache.http.message.BasicNameValuePair;

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

import com.squareup.okhttp.Callback;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.MultipartBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;

public class NetLoader {
    private static final MediaType MEDIA_TYPE_PNG = MediaType
            .parse("image/png");
    public static final MediaType JSON = MediaType
            .parse("application/json; charset=utf-8");

    private static NetLoader mInstance;
    /**
     * 多次网络请求的类型 这里先默认先进先出,在初始化的时候可以进行重置
     */
    private Type type = Type.FIFO;
    /**
     * 线程池
     */
    private ExecutorService mThreadPool;
    /**
     * 设置默认线程数为1
     */
    private static final int DEFAULT_THREAD_COUNT = 1;
    /**
     * 后台轮询线程
     */
    private Thread mPoolThread;
    private LinkedList<Runnable> mTaskQueue;
    /**
     * 创建ui线程的handler
     */
    private Handler UIhandler;
    /**
     * 创建子线程的handler
     */
    private Handler childHandler;
    /**
     * 这里使用的是okhttp
     *
     */
    private OkHttpClient client;
    private Map<String, NetResponseListener> listeners;
    /**
     * 定义管理子线程中handler的信量化
     */
    private Semaphore mSemaphoreChildHander = new Semaphore(0);;
    /**
     * 定义管理线程池的信量化
     */
    private Semaphore mSemaphoreThreadPool;

    /**
     * 一下为uihandler的所用的常量
     */
    private static final int UI_GET_FAILED = 0X100;
    private static final int UI_POST_FAILED = 0X101;
    private static final int UI_POST_FILE_FAILED = 0X102;
    private static final int UI_POST_PARAS_FILE_FAILED = 0X103;
    private static final int UI_POST_COOKIE_FAILE = 0x104;

    private static final int UI_GET_SUCCED = 0x110;
    private static final int UI_POST_SUCCED = 0X111;
    private static final int UI_POST_FILE_SUCCED = 0X112;
    private static final int UI_POST_PARAS_FILE_SUCCED = 0X113;
    private static final int UI_POST_COOKIE_SUCCED = 0X115;

    private static final int CHILD_MES = 0x114;

    /**
     * 以下为具体代码
     * ********************************************************************/
    public enum Type {
        FIFO, LIFO
    }

    public interface NetResponseListener {
        void success(String resultString);

        void fail(String failString, Exception e);
    }

    private NetLoader(int threadCount, Type type) {
        init(threadCount, type);
    }

    /**
     * 初始化方法
     *
     * @param threadCount
     * @param type2
     */
    private void init(int threadCount, Type type) {
        mSemaphoreThreadPool = new Semaphore(threadCount);
        mPoolThread = new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                Looper.prepare();
                childHandler = new Handler() {
                    public void handleMessage(Message msg) {
                        mThreadPool.execute(getTask());
                        try {
                            mSemaphoreThreadPool.acquire();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    }

                };
                mSemaphoreChildHander.release();// 在此通知handler初始化完毕
                Looper.loop();

            }
        });
        mPoolThread.start();
        mThreadPool = Executors.newFixedThreadPool(threadCount);
        mTaskQueue = new LinkedList<Runnable>();
        listeners = new HashMap<String, NetLoader.NetResponseListener>();
        this.type = type;
        client = new OkHttpClient();
        UIhandler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                case UI_GET_FAILED:// GET网络数据加载失败
                    failData(msg);
                    break;
                case UI_POST_FILE_FAILED:// post上传文件失败
                    failData(msg);
                    break;
                case UI_POST_FAILED:// post请求失败
                    failData(msg);
                    break;
                case UI_POST_PARAS_FILE_FAILED:// post上传文件和参数失败
                    failData(msg);
                    break;
                case UI_POST_COOKIE_FAILE:
                    failData(msg);
                    break;
                case UI_GET_SUCCED:// get请求加载成功
                    sucData(msg);
                    break;
                case UI_POST_FILE_SUCCED:// 上传文件成功
                    sucData(msg);
                    break;
                case UI_POST_PARAS_FILE_SUCCED:// 上传文件以及携带参数成功
                    sucData(msg);
                    break;
                case UI_POST_SUCCED:// post请求成功
                    sucData(msg);
                    break;
                case UI_POST_COOKIE_SUCCED:
                    sucData(msg);
                    break;

                default:
                    break;
                }

            };
        };

    }

    /****************************************************************/
    /**
     * 数据成功的回调
     *
     * @param message
     */
    private void sucData(Message message) {
        if (message != null) {
            SucHolder holder = (SucHolder) message.obj;
            String url = holder.url;
            String result = holder.result;
            if (listeners.containsKey(url)) {
                NetResponseListener listener = listeners.get(url);
                listener.success(result);
            }
            listeners.remove(url);
        }

    }

    private void failData(Message message) {
        if (message != null) {
            FailHolder holder = (FailHolder) message.obj;
            String url = holder.url;
            String failString = holder.failString;
            Exception e = holder.exception;
            if (listeners.containsKey(url)) {
                NetResponseListener listener = listeners.get(url);
                listener.fail(failString, e);

            }
            listeners.remove(url);
        }
    }

    /*********************************************************************/

    /**
     * 采用懒加载
     *
     * @return
     */
    public static NetLoader getInstance() {
        if (mInstance == null) {
            synchronized (NetLoader.class) {
                if (mInstance == null) {
                    mInstance = new NetLoader(DEFAULT_THREAD_COUNT, Type.LIFO);
                }
            }
        }
        return mInstance;
    }

    /**
     * 可以用此方法现在application中初始化
     *
     * @param threadCount
     * @param type
     * @return
     */
    public static NetLoader getInstance(int threadCount, Type type) {
        if (mInstance == null) {
            synchronized (NetLoader.class) {
                if (mInstance == null) {
                    mInstance = new NetLoader(threadCount, type);
                }
            }
        }
        return mInstance;
    }

    /**
     * 加载get请求
     *
     * @param url
     */
    public void loadGetData(final String url, NetResponseListener listener) {
        listeners.put(url, listener);
        addTask(new Runnable() {
            public void run() {

                Request request = new Request.Builder().url(url).build();
                client.newCall(request).enqueue(new Callback() {

                    @Override
                    public void onResponse(Response arg0) throws IOException {
                            String result = getResponseString(arg0);
                            Message message = getSucMessage(url, result,
                                    UI_GET_SUCCED);
                            UIhandler.sendMessage(message);
                        
                    }

                    @Override
                    public void onFailure(Request arg0, IOException arg1) {
                        String failString = getFailedString(arg0);
                        Message message = getFailMessage(url, failString, arg1,
                                UI_GET_SUCCED);
                        UIhandler.sendMessage(message);

                    }
                });
                mSemaphoreThreadPool.release();
            }
        });

    }

    /**
     * 加载普通post请求
     */
    public void loadOrdinaryPostData(final String url,
            NetResponseListener listener, final List<BasicNameValuePair> list) {
        String urlString = "";
        for (BasicNameValuePair basicNameValuePair : list) {
            urlString += basicNameValuePair.getName() + "=" + basicNameValuePair.getValue() + "&";
            
        }
        urlString  = url + urlString;
        final String str = urlString;
        listeners.put(str, listener);
        addTask(new Runnable() {

            @Override
            public void run() {
                FormEncodingBuilder builder = new FormEncodingBuilder();
                if (list != null && list.size() > 0) {
                    for (int i = 0; i < list.size(); i++) {
                        BasicNameValuePair pairs = list.get(i);
                        builder.add(pairs.getName(), pairs.getValue());
                    }
                }
                if (builder != null) {
                    Request request = new Request.Builder().url(url)
                            .post(builder.build()).build();
                    client.newCall(request).enqueue(new Callback() {

                        @Override
                        public void onResponse(Response arg0)
                                throws IOException {
                            String result = getResponseString(arg0);
                            Message message = getSucMessage(str, result,
                                    UI_POST_SUCCED);
                            UIhandler.sendMessage(message);
                        }

                        @Override
                        public void onFailure(Request arg0, IOException arg1) {
                            String failString = getFailedString(arg0);
                            Message message = getFailMessage(str,failString, arg1,
                                    UI_POST_FAILED);
                            UIhandler.sendMessage(message);
                        }
                    });
                }
                mSemaphoreThreadPool.release();
            }
        });
    }

    /**
     * 上传文件的post请求
     */
    public void loadPostFilesData(final String url, final String[] filekeys,
            final String[] filePaths, NetResponseListener listener) {
        String urlString = "";
        for (int i = 0; i < filePaths.length; i++) {
            urlString += filekeys[i] + "=" + filePaths[i] + "&";
        }
        final String str =url + urlString;
        listeners.put(str, listener);
        addTask(new Runnable() {

            @Override
            public void run() {
                MultipartBuilder builder = new MultipartBuilder();
                builder.type(MultipartBuilder.FORM);
                if (filePaths.length > 0 && filekeys.length > 0
                        && (filekeys.length == filePaths.length)) {
                    File[] files = new File[filePaths.length];
                    for (int i = 0; i < filePaths.length; i++) {
                        files[i] = new File(filePaths[i]);
                        builder.addFormDataPart(filekeys[i], filePaths[i],
                                RequestBody.create(MEDIA_TYPE_PNG, files[i]));
                    }

                }
                if (builder != null) {
                    Request request = new Request.Builder().url(url)
                            .post(builder.build()).build();
                    client.newCall(request).enqueue(new Callback() {

                        @Override
                        public void onResponse(Response arg0)
                                throws IOException {
                            String result = getResponseString(arg0);
                            Message message = getSucMessage(str, result,
                                    UI_POST_FILE_SUCCED);
                            UIhandler.sendMessage(message);
                        }

                        @Override
                        public void onFailure(Request arg0, IOException arg1) {
                            String failString = getFailedString(arg0);
                            Message message = getFailMessage(str,failString, arg1,
                                    UI_POST_FILE_FAILED);
                            UIhandler.sendMessage(message);
                        }
                    });
                }

                mSemaphoreThreadPool.release();
            }
        });
    }

    /**
     * 上传文件的post请求以及携带参数
     */
    public void loadPostParamsWithFiles(final String url,
            final String[] filekeys, final String[] filePaths,
            NetResponseListener listener, final List<BasicNameValuePair> list) {
        String urlString = "";
        for (BasicNameValuePair basicNameValuePair : list) {
            urlString += basicNameValuePair.getName() + "=" + basicNameValuePair.getValue() + "&";
            
        }
        urlString  = url + urlString;
        final String str = urlString;
        listeners.put(str, listener);
        addTask(new Runnable() {

            @Override
            public void run() {
                MultipartBuilder builder = new MultipartBuilder();
                builder.type(MultipartBuilder.FORM);
                if (list != null && list.size() > 0) {
                    for (int i = 0; i < list.size(); i++) {
                        BasicNameValuePair pairs = list.get(i);
                        builder.addFormDataPart(pairs.getName(),
                                pairs.getValue());
                    }

                }

                if (filePaths.length > 0 && filekeys.length > 0
                        && (filekeys.length == filePaths.length)) {
                    File[] files = new File[filePaths.length];
                    for (int i = 0; i < filePaths.length; i++) {
                        files[i] = new File(filePaths[i]);
                        builder.addFormDataPart(filekeys[i], filePaths[i],
                                RequestBody.create(MEDIA_TYPE_PNG, files[i]));
                    }

                }
                if (builder != null) {
                    Request request = new Request.Builder().url(url)
                            .post(builder.build()).build();
                    client.newCall(request).enqueue(new Callback() {

                        @Override
                        public void onResponse(Response arg0)
                                throws IOException {
                            String result = getResponseString(arg0);
                            Message message = getSucMessage(str, result,
                                    UI_POST_PARAS_FILE_SUCCED);
                            UIhandler.sendMessage(message);
                        }

                        @Override
                        public void onFailure(Request arg0, IOException arg1) {
                            String failString = getFailedString(arg0);
                            Message message = getFailMessage(str,failString, arg1,
                                    UI_POST_PARAS_FILE_FAILED);
                            UIhandler.sendMessage(message);
                        }
                    });
                }

                mSemaphoreThreadPool.release();
            }
        });
    }

    /**
     * post上传携带cookie
     *
     * @param url
     * @param json
     * @param cookiekey
     * @param cookie
     * @param listener
     */
    public void loadPostDataWithCokkie(final String url, final String json,
            final String cookiekey, final String cookie,
            NetResponseListener listener) {
        final String str = url + json;
        listeners.put(str, listener);
        addTask(new Runnable() {

            @Override
            public void run() {
                RequestBody body = RequestBody.create(JSON, json);
                Request request = new Request.Builder()
                        .header(cookiekey, cookie).url(url).post(body).build();
                client.newCall(request).enqueue(new Callback() {

                    @Override
                    public void onResponse(Response arg0) throws IOException {
                        // TODO Auto-generated method stub
                        String result = getResponseString(arg0);
                        Message message = getSucMessage(str, result,
                                UI_POST_COOKIE_SUCCED);
                        UIhandler.sendMessage(message);

                    }

                    @Override
                    public void onFailure(Request arg0, IOException arg1) {
                        // TODO Auto-generated method stub
                        String failString = getFailedString(arg0);
                        Message message = getFailMessage(str,failString, arg1,
                                UI_POST_COOKIE_FAILE);
                        UIhandler.sendMessage(message);
                    }
                });
                mSemaphoreThreadPool.release();

            }
        });
    }

    /**
     * 添加任务到队列中
     *
     * @param runnable
     *            加同步锁以防线程并发
     */
    private synchronized void addTask(Runnable runnable) {
        mTaskQueue.add(runnable);
        if (childHandler == null) {// 如果子线程的中handler为空 那么等待handler初始化
            try {
                mSemaphoreChildHander.acquire();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        childHandler.sendEmptyMessage(CHILD_MES);

    }

    /**
     * 从任务中取出任务
     *
     * @return
     */
    private Runnable getTask() {
        if (type == Type.FIFO) {
            return mTaskQueue.removeFirst();
        } else if (type == Type.LIFO) {
            return mTaskQueue.removeLast();
        }
        return null;
    };

    /**
     * 将返回的response转成String
     *
     * @param response
     * @return
     * @throws IOException
     */
    private String getResponseString(Response response) throws IOException {
        if (response != null) {
            return response.body().string();
        }
        return null;
    }

    /**
     * 将失败的request转化成String
     *
     * @param request
     * @return
     */
    private String getFailedString(Request request) {
        if (request != null) {
            return request.body().toString();
        }
        return null;

    }

    /**
     * 得到成功的message
     *
     * @param result
     * @param code
     * @return
     */
    private Message getSucMessage(String url, String result, int code) {
        if (result != null && code != -1) {
            Message message = Message.obtain();
            message.obj = getSucHolder(url, result);
            message.what = code;
            return message;
        }
        return null;

    }

    /**
     * 得到失败的message
     *
     * @param failString
     * @param e
     * @param code
     * @return
     */
    private Message getFailMessage(String  url,String failString, IOException e, int code) {
        if (failString != null && e != null && code != -1) {
            Message message = Message.obtain();
            message.what = code;
            message.obj = getFailHolder(url, failString, e);
            return message;
        }
        return null;
    }

    /**
     * 得到失败的holder对象
     *
     * @param failString
     * @param e
     * @return
     */
    private FailHolder getFailHolder(String url, String failString, IOException e) {
        if (failString != null && e != null) {
            FailHolder holder = new FailHolder();
            holder.exception = e;
            holder.failString = failString;
            holder.url = url;
            return holder;
        }
        return null;

    }

    /**
     * 得到成功的holder对象
     *
     * @param url
     * @param result
     * @return
     */
    private SucHolder getSucHolder(String url, String result) {
        if (url != null && result != null) {
            SucHolder holder = new SucHolder();
            holder.result = result;
            holder.url = url;
            return holder;
        }
        return null;
    }

    /**
     * 失败缓存
     *
     * @author nanchaodong
     *
     */
    private class FailHolder {
        String failString;
        Exception exception;
        String url;
    }

    /**
     * 成功缓存
     *
     * @author nanchaodong
     *
     */
    private class SucHolder {
        String url;
        String result;
    }

}

 

 

 






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值