封装HttpUtil访问网络的耗时操作

当我们一个工程需要频繁的进行访问网络的耗时操作的时候就可以把方法封装成一个类以便使用时调用

首先要创建一个bean类,来区分是GET还是POST方法来请求网络

  public String url="";
    public String value="";
    //默认为GET请求
    public String method="GET";
    //get请求
    public RequestBean(String url) {
        this.url = url;
    }
    //post请求
    public RequestBean(String url, String value, String method) {
        this.url = url;
        this.value = value;
        this.method = method;
    }

然后可以进行封装

//在activity中调用此方法,请求数据,并获取返回的数据;
    public void getDataFromServer(Context context, RequestBean bean, DataCallBack callBack){
        MyHandler handler=new MyHandler(context,callBack);
        MyTask task=new MyTask(bean,handler);
        //获取CPU数量
        int cpunum = Runtime.getRuntime().availableProcessors();
        //线程池实例化
        ExecutorService service = Executors.newScheduledThreadPool(cpunum + 1);
        //将子线程放入线程池执行;
        service.execute(task);
    }

    /**
     * 因为网络请求是耗时操作所以需要在线程里进行
     * 这里创建一个内部类 继承Thread  重写run方法
     */
    class MyTask extends Thread{
        private RequestBean requestBean;
        private MyHandler handler;

        public MyTask(RequestBean requestBean, MyHandler handler) {
            this.requestBean = requestBean;
            this.handler = handler;
        }

        @Override
        public void run() {
            super.run();
            try {
                URL url=new URL(requestBean.url);
                HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                //判断是什么请求方式
                if(requestBean.method.equals("POST")){
                    connection.setRequestMethod(requestBean.method);
                    connection.setDoOutput(true);
                    OutputStream outputStream = connection.getOutputStream();
                    outputStream.write(requestBean.value.getBytes());
                }
                StringBuilder builder=new StringBuilder();
                int code = connection.getResponseCode();
                if(code==HttpURLConnection.HTTP_OK){
                    InputStream is = connection.getInputStream();
                    String str="";
                    BufferedReader reader=new BufferedReader(new InputStreamReader(is));
                    while ((str=reader.readLine())!=null){
                        builder.append(str);
                    }
                }
                //利用
                Message message=Message.obtain();
                message.obj=builder.toString();
                message.what=code;
                handler.sendMessage(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 请求的数据哟啊通过Handler接收
     */
    class MyHandler extends Handler{
        private Context context;
        private DataCallBack callBack;

        public MyHandler(Context context, DataCallBack callBack) {
            this.context = context;
            this.callBack = callBack;
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            int what = msg.what;
            if(what==200){
                String json= (String) msg.obj;
                callBack.prosseData(json);
            } else {
                Toast.makeText(context, "请求失败!", Toast.LENGTH_SHORT).show();
            }
        }
    }

    public abstract interface DataCallBack{
        public abstract void prosseData(String json);
    }

最后就是在需要请求数据的时候进行调用

//地址
        String url= null;
        try {
            url = "http://japi.juhe.cn/comic/book?type="+ URLEncoder.encode(title, "utf-8")+"&key=4aa7945424c431ea9ac3edd39728cac9";
        } catch (Exception e) {
            e.printStackTrace();
        }
        //选择是什么方式请求数据
        RequestBean requestBean=new RequestBean(url);

        new HttpUtil().getDataFromServer(Content_classify_Activity.this, requestBean, new HttpUtil.DataCallBack() {
            @Override
            public void prosseData(String json) {
              //json就是从网络上得到的json字符串
            }
        });

要记得在xml文件里添加权限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值