Android中的网络通讯方式有多种,这个我们在前一篇文章《Android 网络连接——URLConnection 》中已经提到过,Android网络通信有:支持JDK提供的ServiceScoket,Scoket的TCP/IP通信,支持JDK提供的Datagrampacket,DatagramScoket的UDP通信,当然也支持JDK提供的URL, URLConnection通信,除此之外Android内置了HttpClient,这样可以更加方便的发送Http请求和获取Http的响应。
  
  但是在开发中,很少会直接使用HttpURLConnection,大部分都是使用封装好的Volley,XUtils或者其他的网络框架。说到这可能很多和博主一样的初学者就有些犯晕了,怎么那么多网络连接的方式,他们之间到底什么关系,我们可以通过一张图来看一下,这里只列出博主学习过的网络连接方式,当然除这些方式外还有很多:

  这一篇我们先来学习HttpClient。HttpClient是Apache对HttpURLConnection进行封装后的一种请求和获取网络连接的方式,其使用与Java中的使用也是完全相同的,可以参考文章《Java中HttpClient网络连接 》学习。

  HttpClient对于网络的请求和提交有两种方式:”GET“,“POST”。但是与HttpURLConnection相比,请求和提交更加方便。使用Apache的HttpClient连接首先要先导入jar包。

使用准备

  Android在6.0之前是支持使用HttpClient,但是在6.0之后就抛弃了HttpClient。因此,在6.0及以上版本使用HttpClient就要先导入jar包。AndroidStudio提供了一个非常好用的工具就是可以在线导入工具包。具体导入步骤我在《AndroidStudio使用——如何导入jar包 》这篇博客中已经讲过,这里我们不再重复。我们导入下图所示的包:
  

HttpClient GET

  Android中HttpClient的使用与Java中是相同的。
1. 创建HttpClient类实例。
  因为HttpClient是一个接口,所以我们通过DefaultHttpClient创建。
2. 设置get方法。
  urlString为解析的服务器的地址,加传送的数据的内容。

HttpGet get = new HttpGet(urlString);
get.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

3. 执行get方法。
  通过执行get方法, 将获得返回的所有语句存储在Response对象中。
4. 获得返回的数据。
  获得数据前,我们要先判断是否连接成功,通过获取网络连接的状态码来判断。如果状态码为200,则表明可以正常访问服务器。此时便可获取数据,并对其进行处理。

  络连接必须放在子线程中,主线程中不允许有耗时操作。当然有时将网络连接放在主线程中是不会报错的,但是在实际开发中是不允许的。所有我们这里通过按钮点击创建一个子线程调用doGet()方法连接网络。通过Handler与主线程通信,将返回的数据添加到主线程中。线程部分看不懂的建议看文章《Android中的多线程 》。

public class HttpClientDemoActivity extends Activity implements View.OnClickListener {    private static final int TYPE_CONNECT_GET = 0x666666;    private Button mButtonHttpClientGet;    private TextView mTextViewGetContent;    private Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch (msg.what) {                case TYPE_CONNECT_GET:                    String contentGet = (String) msg.obj;                    mTextViewGetContent.setText(contentGet);                    break;                             default:                    break;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_http_client_demo);        mButtonHttpClientGet = (Button) findViewById(R.id.button_httpclient_get);        mTextViewGetContent = (TextView) findViewById(R.id.textview_httpclient_get);        mButtonHttpClientGet.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.button_httpclient_get:                new Thread(new Runnable() {                    @Override                    public void run() {                        doGet();                    }                }).start();                break;            default:                break;        }    }    private void doGet() {        StringBuffer buffer = null;        HttpClient client = new DefaultHttpClient();        HttpGet get = new HttpGet("http://192.168.0.44:8080/MyServiceTest/MyTestServlet?username=hahahahhaha");        try {            get.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");            //执行get方法获得服务器返回的所有数据            HttpResponse response = client.execute(get);            //HttpClient获得服务器返回的表头。            StatusLine statusLine = response.getStatusLine();            //获得状态码            int code = statusLine.getStatusCode();            if (code == HttpURLConnection.HTTP_OK) {                //得到数据的实体。                HttpEntity entity = response.getEntity();                //得到数据的输入流。                InputStream is = entity.getContent();                BufferedReader br = new BufferedReader(new InputStreamReader(is));                String line = br.readLine();                buffer = new StringBuffer();                while (line != null) {                    System.out.println(line);                    buffer.append(line);                    line = br.readLine();                }            }            Message msg = new Message();            msg.obj = buffer.toString().trim();            msg.what = TYPE_CONNECT_GET;            handler.sendMessage(msg);        } catch (IOException e) {            e.printStackTrace();        }    }}

HttpClient POST

1. 创建HttpClient类实例。
  因为HttpClient是一个接口,所以我们通过DefaultHttpClient创建。
2. 设置Post方法。
HttpPost post = new HttpPost(urlString);
设置传入的参数格式

post.setEntity(new UrlEncodedFormEntity(params, “UTF-8”));
post.setHeader(“Content-Type”, “application/x-www-form-urlencoded; charset=UTF-8”);

3. 设置传递的数据。
(1)创建NameValuePair 类对象,通过BasicNameValuePair类来进行创建。
(2)创建ArrayList存储数据参数。
(3)将参数添加进ArrayList中。

4. 执行post方法
  通过执行post方法, 将获得返回的所有语句存储在Response对象中。
5. 获得返回的数据。
  获得数据前,我们要先判断是否连接成功,通过获取网络连接的状态码来判断。如果状态码为200,则表明可以正常访问服务器。此时便可获取数据,并对其进行处理。

public class HttpClientDemoActivity extends Activity implements View.OnClickListener {    private static final int TYPE_CONNECT_POST = 0x999999;    private Button mButtonHttpClientPost;    private TextView mTextViewPostContent;    private Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);                case TYPE_CONNECT_POST:                    String contentPost = (String) msg.obj;                    mTextViewPostContent.setText(contentPost);                    break;                default:                    break;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_http_client_demo);        mButtonHttpClientPost = (Button) findViewById(R.id.button_httpclient_post);        mTextViewPostContent = (TextView) findViewById(R.id.textview_httpclient_post);        mButtonHttpClientPost.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.button_httpclient_post:                new Thread(new Runnable() {                    @Override                    public void run() {                        doPost();                    }                }).start();                break;            default:                break;        }    }    private void doPost() {        StringBuffer buffer = null;        HttpClient client = new DefaultHttpClient();        HttpPost post = new HttpPost("http://192.168.0.44:8080/MyServiceTest/MyTestServlet");        //设置传入的数据        NameValuePair param = new BasicNameValuePair("username", "i need you");        ArrayList<NameValuePair> params = new ArrayList<>();        params.add(param);        try {            //设置传递的参数格式            post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));            post.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");            //执行get方法获得服务器返回的所有数据            HttpResponse response = client.execute(post);            //HttpClient获得服务器返回的表头。            StatusLine statusLine = response.getStatusLine();            //获得状态码            int code = statusLine.getStatusCode();            if (code == HttpURLConnection.HTTP_OK) {                //得到数据的实体。                HttpEntity entity = response.getEntity();                //得到数据的输入流。                InputStream is = entity.getContent();                BufferedReader br = new BufferedReader(new InputStreamReader(is));                String line = br.readLine();                buffer = new StringBuffer();                while (line != null) {                    System.out.println(line);                    buffer.append(line);                    line = br.readLine();                }            }            Message msg = new Message();            msg.obj = buffer.toString().trim();            msg.what = TYPE_CONNECT_POST;            handler.sendMessage(msg);        } catch (IOException e) {            e.printStackTrace();        }    }}

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. python起点网月票榜字体反爬案例
  3. Android(安卓)ContentProvider的使用
  4. Android设备与外接U盘实现数据文件夹拷贝到android设备
  5. 通过网络使用ADB ( Connect to android with ADB over TCP )
  6. android笔试题
  7. Android(安卓)数据存储方式
  8. android nfc中MifareClassic格式的读写
  9. Android(安卓)Hawk数据库 github开源项目

随机推荐

  1. Android API开发之TTS开发之Android TTS
  2. Android处理EditText键盘自动隐藏
  3. Android开发艺术探索 第2章 IPC机制(部分
  4. Android中判断网络功能是否可用
  5. Android 系统字体和颜色样式
  6. Android(安卓)面试题及答案(英文)
  7. 在android 中开发java.net.SocketExcepti
  8. Android 网络多线程断点下载
  9. Android 设置系统SystemUI 顶部StatusBar
  10. Android之发送短信和接收验证码