手动封装http网络框架


1.添加梁王权限:


<uses-permissionandroid:name="android.permission.INTERNET" />


代码 :


2.MainActivity :


package zz.itcast.myhttpclient;

import java.io.InputStream;

import zz.itcast.http.MyHttpClient;
import zz.itcast.http.MyHttpClient.INetResponseListener;
import zz.itcast.http.RequestParameter;
import zz.itcast.http.StreamTool;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void get(View view) {
        MyHttpClient client = new MyHttpClient();
        client.setConnectionTimeOut(5000);
        String url = "http://192.168.0.99:8080/server/LoginServlet?username=zhangsan&password=123";
        client.get(url, new INetResponseListener() {

            @Override
            public void onSuccess(int code, InputStream is) {

                final String str = StreamTool.getStringByStream(is);

                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, str, 0).show();

            }

            @Override
            public void onFail(int code, final String msg) {

                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, msg, 0).show();

            }
        });
    }

    public void post(View view) {

        MyHttpClient client = new MyHttpClient();
        String url = "http://192.168.0.99:8080/server/LoginServlet";
        RequestParameter rp = new RequestParameter();
        
        rp.put("username", "zhangsan");
        rp.put("password", "123");
        
        
        client.post(url, rp, new INetResponseListener() {
            
            @Override
            public void onSuccess(int code, InputStream is) {

                final String str = StreamTool.getStringByStream(is);

                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, str, 0).show();
                
            }
            
            @Override
            public void onFail(int code, String msg) {
            
                Toast.makeText(MainActivity.this, msg, 0).show();
            }
        });
        
    }

}


http 包:



MyHttpClient :



package zz.itcast.http;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

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

public class MyHttpClient {

    private int connTime = 10000;

    private final static int CONN_OK = 0;
    private final static int CONN_NO_OK = 1;

    
    //将子线程的拿到的数据在主线程回调出去
    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            int what = msg.what;
            switch (what) {
            case CONN_OK:
                
                //消息发送过来的数据,包含了监听者,网络状态相应吗,网络返回的数据
                Object[] objs =  (Object[]) msg.obj;
                INetResponseListener listener = (INetResponseListener) objs[0];
                int code = (Integer) objs[1];
                InputStream is = (InputStream) objs[2];
                
                //最精妙之处,通过接口回调给调用者
                listener.onSuccess(code, is);        
                
                break;

            case CONN_NO_OK:
                //消息发送过来的数据,包含了监听者,网络状态相应吗
                Object[] objs2 =  (Object[]) msg.obj;
                INetResponseListener listener2 = (INetResponseListener) objs2[0];
                int code2 = (Integer) objs2[1];
                //最精妙之处,通过接口回调给调用者
                listener2.onFail(code2, "服务器忙");
                
                break;
            default:
                break;
            }
        }
    };

    
    //对外提供一个改变连接超时的方法,如果不调用,默认10秒
    public void setConnectionTimeOut(int time) {
        connTime = time;
    }

    
    /**
     *
     * @param url 要传送的URL
     * @param listener 网络相应的回调 包含onSuccess和onFail方法
     */
    public void get(final String url, final INetResponseListener listener) {

        new Thread() {
            public void run() {
                int code = 0;
                try {
                    //网络的连接
                    URL u = new URL(url);
                    HttpURLConnection conn = (HttpURLConnection) u
                            .openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(connTime);
                    code = conn.getResponseCode();
                    if (code == 200) {
                        // 联网成功
                        InputStream is = conn.getInputStream();
                        if (listener != null) {
                            
                            //联网成功发送消息出去
                            Message msg = Message.obtain();

                            Object[] objs = new Object[] { listener, code, is };

                            msg.obj = objs;
                            msg.what = CONN_OK;
                            handler.sendMessage(msg);

                        }

                    } else {
                        // 联网失败
                        if (listener != null) {
                            // 联网失败 发送消息出去
                            Message msg = Message.obtain();

                            Object[] objs = new Object[] {listener, code};
                            msg.obj = objs;
                            msg.what = CONN_NO_OK;
                            handler.sendMessage(msg);
                            
                        }
                    }

                } catch (Exception e) {
                    if (listener != null) {
                        listener.onFail(code, "服务器忙");
                    }
                    e.printStackTrace();
                }
            };
        }.start();

    }

    
    /**
     *
     * @param url 要传输的URL
     * @param rp 要传输的参数,内部封装的是HashMap 直接put键值对即可
     * @param listener 网络相应的回调 包含onSuccess和onFail方法
     */
    public void post(final String url, final RequestParameter rp,
            final INetResponseListener listener) {

        new Thread() {
            public void run() {
                int code = 0;

                try {
                    URL u = new URL(url);
                    HttpURLConnection conn = (HttpURLConnection) u
                            .openConnection();
                    conn.setRequestMethod("POST");
                    conn.setConnectTimeout(connTime);
                    conn.addRequestProperty("Content-Type",
                            "application/x-www-form-urlencoded");
                    String content = rp.toString();
                    conn.addRequestProperty("Content-Length", content.length()
                            + "");
                    conn.setDoOutput(true);
                    conn.getOutputStream().write(content.getBytes());

                    code = conn.getResponseCode();

                    if (code == 200) {
                        InputStream is = conn.getInputStream();
                        if (listener != null) {
                            Message msg = Message.obtain();

                            Object[] objs = new Object[] { listener, code, is };

                            msg.obj = objs;
                            msg.what = CONN_OK;
                            handler.sendMessage(msg);
                        }
                    } else {
                        if (listener != null) {
                            Message msg = Message.obtain();

                            Object[] objs = new Object[] {listener, code};
                            msg.obj = objs;
                            msg.what = CONN_NO_OK;
                            handler.sendMessage(msg);
                        }
                    }

                } catch (Exception e) {
                    if (listener != null) {
                        Message msg = Message.obtain();

                        Object[] objs = new Object[] {listener, code};
                        msg.obj = objs;
                        msg.what = CONN_NO_OK;
                        handler.sendMessage(msg);
                    }
                    e.printStackTrace();
                }

            }

        }.start();

    }

    //核心指出,框架一般都会有接口,核心之处
    public interface INetResponseListener {

        //网络成功的回调
        void onSuccess(int code, InputStream is);

        //网络失败的回调
        void onFail(int code, String msg);
    }
}



RequestParameter:



package zz.itcast.http;

import java.util.HashMap;
import java.util.Set;

public class RequestParameter {

    private HashMap<String,String> map;
    
    
    public RequestParameter(){
        map = new HashMap<String, String>();
    }
    
    
    public void put(String key,String value){
        map.put(key, value);
    }
    
    public String toString(){
        
        /*
         * username=xxx&password=xxx
         *
         *
         */
        String content = null;
        
        StringBuffer sb = new StringBuffer();
        
        Set<String> keys =  map.keySet();
        
        for(String key:keys){
            sb.append(key);
            sb.append("=");
            sb.append(map.get(key));
            sb.append("&");
        }
        sb.deleteCharAt(sb.length()-1);
        
        content = sb.toString();
        return content;
    }
}


StreamTool:


package zz.itcast.http;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

public class StreamTool {

    public static String getStringByStream(InputStream is) {
        String content = null;

        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            int len = -1;
            byte[] buf = new byte[1024];

            while ((len = is.read(buf)) != -1) {
                baos.write(buf, 0, len);
            }

            content = baos.toString();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return content;

    }

}




猜你喜欢

转载自blog.csdn.net/qq_26554909/article/details/77337328