热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android开发使用HttpURLConnection进行网络编程详解【附源码下载】

这篇文章主要介绍了Android开发使用HttpURLConnection进行网络编程的方法,结合实例形式分析了Android基于HttpURLConnection实现显示图片与文本功能,涉及Android布局、文本解析、数据传输、权限控制等相关操作技巧,需要的朋友可以参考下

本文实例讲述了Android开发使用HttpURLConnection进行网络编程。分享给大家供大家参考,具体如下:

——HttpURLConnection

URLConnection已经可以非常方便地与指定站点交换信息,URLConnection下还有一个子类:HttpURLConnection,HttpURLConnection在URLConnection的基础上进行改进,增加了一些用于操作HTTP资源的便捷方法。

setRequestMethod(String):设置发送请求的方法
getResponseCode():获取服务器的响应代码
getResponseMessage():获取服务器的响应消息

a)get请求的代码:

cOnn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(8000);//连接超时的毫秒数
conn.setReadTimeout(8000);//读取超时的毫秒数

b)post请求的代码

cOnn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");

c)关闭连接

if(conn!=null)conn.disconnect();

实现多线程下载的步骤:

   a)创建URL对象
   b)获取指定URL对象所指向资源的大小:getContentLength()
   c)在本地磁盘上创建一个与网络资源相同大小的空文件
   d)计算每条线程应用下载网络资源的指定部分
   e)依次创建,启动多条线程来下载网络资源的指定部分

注意需要的权限:




更多关于Android权限控制的说明可参考Android Manifest功能与权限描述大全

这里我简单的使用一下HttpURLConnection来进行文本解析和图片解析

编程步骤如下:

1.先写布局文件:


 

2.在MainActivity中文本解析的实现:

//文本解析
public void click2(View view){
 new Thread(){
  public void run() {
   try {
    URL url2=new URL("http://www.baidu.com");
    HttpURLConnection cOnn=(HttpURLConnection) url2.openConnection();
    conn.setRequestMethod("GET");
    conn.setConnectTimeout(8000);
    conn.setReadTimeout(8000);
    conn.connect();
    if(conn.getResponseCode()==200){
     InputStream inputStream=conn.getInputStream();
     ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
     byte[]b=new byte[512];
     int len;
     while ((len=inputStream.read(b))!=-1) {
      byteArrayOutputStream.write(b,0,len);
     }
     String text=new String(byteArrayOutputStream.toByteArray(),"UTF-8");
     Message msg=Message.obtain();
     msg.what=0x124;
     msg.obj=text;
     handler.sendMessage(msg);
    }
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  };
 }.start();
}

这里使用了GET方式~也可以用POST方式~

3.在MainActivity中图片解析的实现:

//图片解析
public void click(View view){
 final File file=new File(getCacheDir(),"2.png");
 if(file.exists()){
  System.out.println("使用缓存");
  Bitmap bitmap=BitmapFactory.decodeFile(file.getAbsolutePath());
  iv.setImageBitmap(bitmap);
 }else{
  new Thread(){
   public void run() {
    try {
     URL url=new URL("http://192.168.207.1:8090/2.png");
     System.out.println("使用网络");
     HttpURLConnection cOnn=(HttpURLConnection) url.openConnection();
     conn.setRequestMethod("GET");
     conn.setConnectTimeout(8000);
     conn.setReadTimeout(8000);
     conn.connect();
     if(200==conn.getResponseCode()){
      //正常连接
      InputStream is=conn.getInputStream();
      //Bitmap bitmap=BitmapFactory.decodeStream(is);
      FileOutputStream fileOutputStream=new FileOutputStream(file);
      int len;
      byte[] b=new byte[1024];
      while ((len=is.read(b))!=-1) {
       fileOutputStream.write(b,0,len);
      }
      fileOutputStream.close();
      Bitmap bitmap=BitmapFactory.decodeFile(file.getAbsolutePath());
      fileOutputStream.flush();
      Message msg=Message.obtain();
      msg.what=0x123;
      msg.obj=bitmap;
      handler.sendMessage(msg);
     }
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   };
  }.start();
 }
}

这个图片解析实现了图片的缓存,想要再一次加载图片的时候,就可以到缓存的文件中得到图片,就可以减少内存的使用~

这个图片我是放在服务器端的这个目录下\apache-tomcat-7.0.37\webapps\upload,从服务器上可以下载这个图片,然后保存在文件中~

4.最后,把文本和图片加载出来

private Handler handler=new Handler(){
 public void handleMessage(android.os.Message msg) {
  if(msg.what==0x123){
   Bitmap bitmap=(Bitmap) msg.obj;
   iv.setImageBitmap(bitmap);
  }
  else if(msg.what==0x124){
   String text=(String) msg.obj;
   tv.setText(text);
  }
 };
};

效果图我就不贴了,知道代码怎么写就行~

完整MainActivity代码如下:

public class MainActivity extends Activity {
 private ImageView iv;
 private TextView tv;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  iv=(ImageView) findViewById(R.id.iv);
  tv=(TextView) findViewById(R.id.tv);
 }
 private Handler handler=new Handler(){
  public void handleMessage(android.os.Message msg) {
   if(msg.what==0x123){
    Bitmap bitmap=(Bitmap) msg.obj;
    iv.setImageBitmap(bitmap);
   }
   else if(msg.what==0x124){
    String text=(String) msg.obj;
    tv.setText(text);
   }
  };
 };
 //文本解析
 public void click2(View view){
  new Thread(){
   public void run() {
    try {
     URL url2=new URL("http://www.baidu.com");
     HttpURLConnection cOnn=(HttpURLConnection) url2.openConnection();
     conn.setRequestMethod("GET");
     conn.setConnectTimeout(8000);
     conn.setReadTimeout(8000);
     conn.connect();
     if(conn.getResponseCode()==200){
      InputStream inputStream=conn.getInputStream();
      ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
      byte[]b=new byte[512];
      int len;
      while ((len=inputStream.read(b))!=-1) {
       byteArrayOutputStream.write(b,0,len);
      }
      String text=new String(byteArrayOutputStream.toByteArray(),"UTF-8");
      Message msg=Message.obtain();
      msg.what=0x124;
      msg.obj=text;
      handler.sendMessage(msg);
     }
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   };
  }.start();
 }
 //图片解析
 public void click(View view){
  final File file=new File(getCacheDir(),"2.png");
  if(file.exists()){
   System.out.println("使用缓存");
   Bitmap bitmap=BitmapFactory.decodeFile(file.getAbsolutePath());
   iv.setImageBitmap(bitmap);
  }else{
   new Thread(){
    public void run() {
     try {
      URL url=new URL("http://192.168.207.1:8090/2.png");
      System.out.println("使用网络");
      HttpURLConnection cOnn=(HttpURLConnection) url.openConnection();
      conn.setRequestMethod("GET");
      conn.setConnectTimeout(8000);
      conn.setReadTimeout(8000);
      conn.connect();
      if(200==conn.getResponseCode()){
       //正常连接
       InputStream is=conn.getInputStream();
       //Bitmap bitmap=BitmapFactory.decodeStream(is);
       FileOutputStream fileOutputStream=new FileOutputStream(file);
       int len;
       byte[] b=new byte[1024];
       while ((len=is.read(b))!=-1) {
        fileOutputStream.write(b,0,len);
       }
       fileOutputStream.close();
       Bitmap bitmap=BitmapFactory.decodeFile(file.getAbsolutePath());
       fileOutputStream.flush();
       Message msg=Message.obtain();
       msg.what=0x123;
       msg.obj=bitmap;
       handler.sendMessage(msg);
      }
     } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    };
   }.start();
  }
 }
}

附:完整实例代码点击此处本站下载

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android通信方式总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。


推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文探讨了在Windows Server 2008环境下配置Tomcat使用80端口时遇到的问题,包括端口被占用、多项目访问失败等,并提供详细的解决方法和配置建议。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文详细介绍了Java Web应用程序中的过滤器(Filter)功能,包括其作用、实现方式及配置方法。过滤器可以在请求到达目标资源之前对其进行预处理,并在响应返回给客户端之前进行后处理。 ... [详细]
author-avatar
许桂欢_173
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有