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包 》这篇博客中已经讲过,这里我们不再重复。我们导入下图所示的包:
  
Android 网络通信——HttpClient_第1张图片

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();        }    }}

Android 网络通信——HttpClient_第2张图片

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();        }    }}

Android 网络通信——HttpClient_第3张图片

更多相关文章

  1. Android 摇一摇太灵敏的解决方法
  2. Android设备与外接U盘实现数据文件夹拷贝到android设备
  3. android之socket网络编程
  4. 通过网络使用ADB ( Connect to android with ADB over TCP )
  5. Android 数据存储方式
  6. Android Hawk数据库 github开源项目
  7. Android 横竖屏切换时候重新进行数据请求问题
  8. Android之数据储存001
  9. android往文件中保存和读取数据

随机推荐

  1. [原]Android(安卓)develop tricks——整
  2. Android(安卓)App 性能优化之安装包大小
  3. 【Android】论ViewHolder存在的意义
  4. android常用控件一二
  5. android 焦点控制及运用
  6. Android(安卓)文件夹介绍
  7. Android网络架构之———OkHttp+Volley+G
  8. android避免内存泄露
  9. Android(安卓)应用的欢迎界面实现代码
  10. 面试常问的问题解决