对HTTPCONNECTION的理解

来源:互联网 发布:win10关闭网络唤醒 编辑:程序博客网 时间:2024/05/20 03:37

首先写一个工具类HttpConnection


package com.example.pc.httpconnectiontest;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;/** * Created by pc on 2016/4/18. * <p/> * 工具类 */public class HttpConnectionUtil {    public static String getHttpContent(String url) {        return getHttpContent(url, "UTF-8");    }    private static String getHttpContent(String url, String charSet) {        HttpURLConnection connection = null;        String content = "";        try {            URL address_url = new URL(url);            connection = (HttpURLConnection) address_url.openConnection();            connection.setRequestMethod("GET");            //设置访问超时时间及读取网页流的超市时间,毫秒值            connection.setConnectTimeout(1000);            connection.setReadTimeout(1000);            //得到访问页面的返回值            int response_code = connection.getResponseCode();            if (response_code == HttpURLConnection.HTTP_OK) {                InputStream inputStream = connection.getInputStream();                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, charSet));                //把字节流读取出来                String line = "";                while ((line = bufferedReader.readLine()) != null) {                    content += line;                }                return content;            }        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        } finally {            if (connection != null) {                connection.disconnect();            }        }        return "";    }    // 添加post请求    public static String getHttpContent2() {        try {//            URL url2 = new URL("你请求的post参数前面的网址");            URL url2 = new URL("http://fanyi.youdao.com/openapi.do");            HttpURLConnection connection = (HttpURLConnection) url2.openConnection();            //设置 编码方式 (可以)输入输出 以及请求的方法            connection.addRequestProperty("encoding","UTF-8");            connection.setDoInput(true);            connection.setDoOutput(true);            connection.setRequestMethod("POST");            OutputStream os = connection.getOutputStream();            //把字节流转换为字符流            OutputStreamWriter osw = new OutputStreamWriter(os);            BufferedWriter bw = new BufferedWriter(osw);//            bw.write("你请求的post参数");            bw.write("keyfrom=zhanghappyzq&key=301249901&type=data&doctype=xml&version=1.1&q=congratulation");            bw.flush();            InputStream is = connection.getInputStream();            InputStreamReader isr = new InputStreamReader(is);            BufferedReader br = new BufferedReader(isr);            String line;            StringBuilder stringBuilder = new StringBuilder();            while ((line = br.readLine()) != null) {                stringBuilder.append(line);            }            bw.close();            osw.close();            os.close();            br.close();            isr.close();            is.close();            System.out.println(stringBuilder.toString());            return stringBuilder.toString();        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return "";    }}


然后在MainActivity中显示出来,在MainActivity中用到 Handler


package com.example.pc.httpconnectiontest;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.Toast;import java.io.IOException;public class MainActivity extends AppCompatActivity {    private String content;    private String str_noBuf;    private String str_Buf;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button button = (Button) findViewById(R.id.button);        Button button2 = (Button) findViewById(R.id.button2);        Button button3 = (Button) findViewById(R.id.button3);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                new Thread(new Runnable() {                    @Override                    public void run() {                        //网络Connection请求方面//                        content = HttpConnectionUtil.getHttpContent("http://www.baidu.com");                        content = HttpConnectionUtil.getHttpContent2();                        if (content != null && content != "") {                            Message message = mhandler.obtainMessage();                            message.what = 1;                            message.obj = "";                            mhandler.sendMessage(message);                        }                    }                }).start();            }        });        button2.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                new Thread(new Runnable() {                    @Override                    public void run() {                        //InputStreamReaderTest nobuf                        try {                            str_noBuf = InputStreamReaderTest.transReadNoBuf();                            Log.d("MainActivity","str_noBuf?");                        } catch (IOException e) {                            e.printStackTrace();                        }                        if (str_noBuf != null && str_noBuf != "") {                            Message message = mhandler.obtainMessage();                            message.what = 2;                            mhandler.sendMessage(message);                        }                        Log.d("MainActivity","str_noBuf=="+str_noBuf);                    }                }).start();            }        });        button3.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                new Thread(new Runnable() {                    @Override                    public void run() {                        //InputStreamReaderTest buf                        try {                            str_Buf = InputStreamReaderTest.transReadNoBuf();                        } catch (IOException e) {                            e.printStackTrace();                        }                        if (str_Buf != null && str_Buf != "") {                            Message message = mhandler.obtainMessage();                            message.what = 3;                            mhandler.sendMessage(message);                        }                    }                }).start();            }        });    }    private Handler mhandler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch (msg.what) {                case 1:                    Toast.makeText(MainActivity.this, content, Toast.LENGTH_LONG).show();                    Log.d("MainActivity", content);                    break;                case 2:                    Toast.makeText(MainActivity.this, str_noBuf, Toast.LENGTH_LONG).show();                    Log.d("MainActivity", str_noBuf);                    break;                case 3:                    Toast.makeText(MainActivity.this, str_Buf, Toast.LENGTH_LONG).show();                    Log.d("MainActivity", str_Buf);                    break;                default:                    break;            }        }    };}


布局文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:fitsSystemWindows="true"    android:orientation="vertical"    tools:context=".MainActivity">    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="New Button1"        android:id="@+id/button" />    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="New Button2"        android:id="@+id/button2" />    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="New Button3"        android:id="@+id/button3" /></LinearLayout>



<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.pc.httpconnectiontest" >    <uses-permission android:name="android.permission.INTERNET"/>    <!--往sdcard中写入数据的权限 -->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>    <!--在sdcard中创建/删除文件的权限 -->    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>        <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme" >        <activity            android:name=".MainActivity"            android:label="@string/app_name"            android:theme="@style/AppTheme.NoActionBar" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>



出现的错误以及解决方案:


一般形如:Unable to resolve host "www.xxxx.com" : No address associated with hostname

碰到这个问题是在android系统中。

检测如下几点:

1. 浏览器使用了proxy,但是你的app没有。设置

[java] view plain copy
 print?
  1. System.setProperty("http.proxyHost""my.proxyhost.com");  
  2. System.setProperty("http.proxyPort""1234");  


2. 浏览器可以访问网络,但是app不行?

3. 是不是SSL的原因。

自己的遇到这个问题,最终发现是app的网络设置有问题,改正后,就可以连接网络了


thanks  for    http://blog.csdn.net/cctt_1/article/details/8595791.



另外为什么不用 Message message = new Message(); 而用  Message message =mhandler.obtainMessage();


通过比较我们会发现,这两种获取Message的实例的方法不一样,于是我看了源码,果然不一样:
 
查看obtainMessage()源码:
 
图1:
   
进入obtain方法:
 
图2:
 
再进入objtain方法:
 
图3:
 
 
 
进入Message方法:
 
图4:
 
 
总结:
 
上面的图3中obtain方法的注释中说得很明白:从整个Messge池中返回一个新的Message实例,在许多情况下使用它,因为它能避免分配新的对象
 
如果是这样的话,那么通过调用obtainMessage方法获取Message对象就能避免创建对象,从而减少内存的开销


1 0