zoukankan      html  css  js  c++  java
  • HttpURLConnection 用法

    Android的网络通信的方式有两种:
    1. Socket
    2. HTTP
    而其中,HTTP又包括两种编程方式:
    1. HttpURLConnection
    2. HttpClient
    这篇文章介绍的就是HttpURLConnection
     
    首先,当然是创建HttpURLConnection的对象
    URL url = new URL("www.baidu.com");  
    HttpURLConnection connection=(HttpURLConnection)url.openConnection(); 
     
    第二步是设置,其中最重要的就是 GET or POST?(GET是从服务器读取数据,POST是提交数据给服务器)
     
    connection.setRequestMethod("GET");
    connection.setConnectTimeout(8000);//连接超时
    connection.setReadTimeout(8000);//读取超时
     
    接着,就可以从connection中获取数据了
    InputStream in = connection.getInputStream();
     
    最后需要关闭连接
    connection.disconnect();
     
    例子
     
    要访问网络,所以需要在清单文件里添加权限:
        <uses-permission android:name="android.permission.INTERNET"/>
     
    MainActivity.java
    public class MainActivity extends Activity implements OnClickListener {
     
        private Button sendRequest;
        private TextView responseText;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            sendRequest = (Button) findViewById(R.id.send_request);
            responseText = (TextView) findViewById(R.id.response);
            sendRequest.setOnClickListener(this);
        }
     
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (v.getId() == R.id.send_request) {
                sendRequestWithHttpURLConnection();
            }
        }
     
        private void sendRequestWithHttpURLConnection() {
            new Thread(new Runnable() {
     
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    HttpURLConnection connection = null;
                    try {
                        URL url = new URL("www.baidu.com");
                        connection = (HttpURLConnection) url.openConnection();
                        connection.setConnectTimeout(8000);
                        connection.setReadTimeout(8000);
                        connection.setRequestMethod("GET");
                        String line = null;
                        StringBuilder response = new StringBuilder();
                        InputStream in = connection.getInputStream();
                        BufferedReader reader = new BufferedReader(
                                new InputStreamReader(in));
                        while ((line = reader.readLine()) != null) {
                            response.append(line);
                            Log.e("MainActivity", line);
                        }
                        responseText.setText(response.toString());
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        if (connection != null)
                            connection.disconnect();
                    }
                }
            }).start();
        }
    }
     
    上面代码的逻辑很简单,就是:点击“发送”按钮,从百度首页获取数据,并显示在文本框里。
     
    但这里有两个问题需要注意:
    1. 写网址,也就是URL时,需要加上协议名,也就是"http://"
    2. 上面的代码如果真的运行,文本框里是不会显示任何内容的,因为子线程中无法对 UI 进行操作
    第一个问题容易解决,加上http://就行了。
     
    而第二个问题,解决的办法是:创建一个Message对象,使用Handler把它发送出去,在Handler的方法里来处理这条Message。
     
    修改后的代码
     
    public class MainActivity extends Activity implements OnClickListener {
     
        private Button sendRequest;
        private TextView responseText;
     
        public static final int SHOW_RESPONSE = 0;
        private Handler handler = new Handler(){
            public void handleMessage(Message msg){
                switch (msg.what) {
                case SHOW_RESPONSE:
                    String response = (String)msg.obj;
                    responseText.setText(response);
                    break;
     
                default:
                    break;
                }
            }
        };
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            sendRequest = (Button) findViewById(R.id.send_request);
            responseText = (TextView) findViewById(R.id.response);
            sendRequest.setOnClickListener(this);
        }
     
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (v.getId() == R.id.send_request) {
                sendRequestWithHttpURLConnection();
            }
        }
     
        private void sendRequestWithHttpURLConnection() {
            new Thread(new Runnable() {
     
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    HttpURLConnection connection = null;
                    try {
                        URL url = new URL("http://www.baidu.com");
                        connection = (HttpURLConnection) url.openConnection();
                        connection.setConnectTimeout(8000);
                        connection.setReadTimeout(8000);
                        connection.setRequestMethod("GET");
                        String line = null;
                        StringBuilder response = new StringBuilder();
                        InputStream in = connection.getInputStream();
                        BufferedReader reader = new BufferedReader(
                                new InputStreamReader(in));
                        while ((line = reader.readLine()) != null) {
                            response.append(line);
                            Log.e("MainActivity", line);
                        }
                        Message message = new Message();
                        message.what = SHOW_RESPONSE;
                        message.obj = response.toString();
                        handler.sendMessage(message);
                       
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        if (connection != null)
                            connection.disconnect();
                    }
                }
            }).start();
        }
    }
     
    如果在本机上开了Tomcat服务器,那么URL里的内容就可以是http://192.168.0.100:8080 
     
    这样,点击按钮后,就能在文本框里显示本机里的这个URL的内容了。 
     
    莫问前程
  • 相关阅读:
    2019年春季学期第三周作业
    2019年春季学期第二周作业
    7-2 求最大值及其下标 (20 分)
    7-1 查找整数 (10 分)
    人生中最重要的三位老师
    自我介绍
    学期总结
    编程作业 抓老鼠啊~亏了还是赚了?
    作业——10
    作业——9
  • 原文地址:https://www.cnblogs.com/dolphin007/p/4455166.html
Copyright © 2011-2022 走看看