封装http请求类,利用回调机制获取返回值

public interface HttpCallbackListener {

    void onFinish(String response);
    
    void onError(Exception e);
}
public class HttpUtil {
    public static void sendHttpRequest(final String address, final HttpCallbackListener listener){
        new Thread(new Runnable(){

            @Override
            public void run() {
                HttpURLConnection connection = null;
                
                try {
                    URL url = new URL(address);
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(8000);
                    connection.setReadTimeout(8000);
                    connection.setDoInput(true);
                    connection.setDoOutput(true);
                    InputStream in = connection.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                    StringBuilder response = new StringBuilder();
                    String line;
                    while((line = reader.readLine()) != null){
                        response.append(line);
                    }
                    if(listener != null){
                        listener.onFinish(response.toString());
                    }
                } catch (Exception e) {
                    if(listener != null){
                        listener.onError(e);
                    }
                } finally{
                    if(connection != null){
                        connection.disconnect();
                    }
                }
            }
            
        }).start();
    }
}

使用方法:

HttpUtil.sendHttpRequest("address", new HttpCallbackListener() {
            
            @Override
            public void onFinish(String response) {
                
            }
            
            @Override
            public void onError(Exception e) {
                
            }
        });

需要注意的是,最终的回调接口还是在子线程中运行的,因此我们不可以在这里执行任何的UI操作,除非借助runOnUiThread()方法来进行线程转换

posted on 2017-01-16 21:51  文森博客  阅读(99)  评论(0编辑  收藏  举报