【16】网络请求

2016-06-26  本文已影响0人  嗟嗟嗟

一、什么是网络请求?

主要学习的http相关的网络请求,可以通过客户端发送请求获取服务端的数据,是现在主要的数据获取来源。

二、为什么需要用网络请求

这个感觉不用多说,大家天天都在用的,看网页、用APP都会用到网络请求,没有网络简直没法活。

三、如何使用

关于如何使用是个大课题,相关的书籍一大堆,我只谈下我的理解,首先要建立链接,然后通过GET或POST来提交申请,服务器就会根据申请来返回数据。GET,POST,PUT,DELETE其实分别对应着增删改查,这边主要讲讲GET和POST

关于GET和POST的区别

具体用法,实力码代码先。。

public class HttpThread extends Thread {

    private String url;
    private WebView webView;
    private Handler handler;

    public HttpThread(String url, Handler handler, WebView webView) {
        this.url = url;
        this.webView = webView;
        this.handler = handler;
    }

    @Override
    public void run() {
        try {
            URL httpUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
            conn.setConnectTimeout(5000);
            conn.setRequestMethod("GET");
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            final StringBuffer stringBuffer = new StringBuffer();
            String str = null;
            while((str=reader.readLine())!=null){
                stringBuffer.append(str);
            }
            Log.i("info","sb = " + stringBuffer.toString());
            handler.post(new Runnable() {
                @Override
                public void run() {
                    webView.loadData(stringBuffer.toString(),"text/html;charset=utf-8",null);
                }
            });


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

因为请求网络资源属于耗时操作,所以要在子线程中执行,这边再使用handler传递消息给主线程,由主线程来更新UI界面之类的任务。

这个例子中先通过

URL httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();

建立链接

然后设置链接相关属性

conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");

最后获取数据

BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
final StringBuffer stringBuffer = new StringBuffer();
String str = null;
while((str=reader.readLine())!=null){
    stringBuffer.append(str);
}

最后的最后通过handler执行界面更新

handler.post(new Runnable() {
    @Override
    public void run() {
        webView.loadData(stringBuffer.toString(),"text/html;charset=utf-8",null);
    }
});

主线程中直接调用就OK了。

new HttpThread("http://www.baidu.com/",handler,webView).start();

这只是一个简单的例子,可以看到这个方法很有局限性,不方便复用,只能完成简单的数据获取。

有时间我再更新一下静态的http调用方法。。

更新一下,静态调用http请求的方法。

HTTP连接的类的静态调用

因为http连接是耗时操作,不能直接在主线程中执行,所以需要新建一个子线程,但是子线程中的数据何时从服务器端发送回来,无法预知,那如何从子线程中把数据传递到主线程呢?

我们可以新建一个回调接口,用回调的方式来发送数据

public interface HttpCallbackListener {

    void onFinish(String response);

    void onError(Exception e);
}

然后建立HttpUtil类

public class HttpUtil {


    public static void sendHttpRequest(final String address,final HttpCallbackListener listener){

        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection conn = null;
                try {
                    URL url = new URL(address);
                    conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(8000);
                    conn.setReadTimeout(8000);
//                    conn.getDoInput(true);
//                    conn.getDoOutput(true);
                    InputStream is = conn.getInputStream();
                    StringBuilder response = new StringBuilder();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                    String line;
                    while((line = reader.readLine()) != null){
                        response.append(line);
                    }

                    if (listener != null){
                        //回调onFinish方法
                        listener.onFinish(response.toString());
                    }


                } catch (Exception e) {
                    e.printStackTrace();
                    if (listener != null){
                        //回调onError
                        listener.onError(e);
                    }
                }
            }
        }).start();
    }
}

在静态方法中,加入回调接口类的参数,将消息数据传入到onFinish()方法中,其他类调用该静态方法时,就可以通过实现接口的方法,调用到数据。不过此时还是在子线程中,还是需要用handler发送出去消息。

HttpUtil.sendHttpRequest(url, new HttpCallbackListener() {
    @Override
    public void onFinish(String response) {
        Message msg = new Message();
        msg.obj = response;
        handler.sendMessage(msg);
    }
    @Override
    public void onError(Exception e) {
    }
});
上一篇 下一篇

猜你喜欢

热点阅读