Android网络操作的几种方法

安卓开发软件:AndroidStudio

服务器软件:Myeclipse+Tomcat

首先无论是哪种方式,安卓手机软件要想联网,必须要申请联网权限(android.permission.INTERNET)。

安卓主线程不允许做耗时操作(联网操作就是一种耗时操作),所以下面的的网络操作都是通过内部匿名类另起的一个线程操作的。

一,第一种方式:使用HttpURLConnection进行联网操作

  这个方法需要我们手动构建一个http请求包,发送到指定的服务器

  1. get方式

    1. 设置URL
    2. 打开连接
    3. 设置请求方法为get
    4. 设置连接超时时间
    5. 设置读取超时时间
    6. 把当前的request发送到服务器端
    7. 等待服务器的响应(此处会阻塞)
    8. 获得响应码(并在响应码中做相应的操作),因为安卓子线程内不允许做UI更新的操作,所以需要转到主线程来做(通过安卓中的handler来将信息传递到主线程)

      public void getPic(View v){
              new Thread(new Runnable() {
                  @Override
                  public void run() {
                      try {
                          //首先要支出服务器的地址
                          URL url=new URL("http://192.168.2.1/day10_NetworkServer/brushli.jpg");
                          //通过http连接
                          HttpURLConnection httpurlConnection = (HttpURLConnection) url.openConnection();
                          //设置请求方式,并设置等待响应时间
                          httpurlConnection.setRequestMethod("GET");
                          httpurlConnection.setConnectTimeout(5000);
                          //把当前的request发送到服务器(安卓不允许在主线程内做耗时操作,如连接服务器)
                          httpurlConnection.connect();
                          //发送完连接后等待操作,这个是阻塞式方法,
                          int responseCode = httpurlConnection.getResponseCode();
      
                          //根据得到的响应代码和response的信息作出相应的操作
                          if(responseCode==200){
                              //从服务器读取正确与否的信息
                              InputStream is=httpurlConnection.getInputStream();
                              File file=new File("/data/data/com.rgd.day10_network_3/files");
                              file.mkdir();
                              FileOutputStream fos=new FileOutputStream(new File("/data/data/com.rgd.day10_network_3/files/brushli.jpg"));
                              byte[] buffer=new byte[1024];
                              int read;
                              while ((read =is.read(buffer))!=-1){
                                  fos.write(buffer,0,read);
                              }
                              //由于子线程不允许做UI更新操作,与要通过Handler进行和主线程的通信操作
      
                              Message msg=new Message();
                              msg.what=1;
                              handler.sendMessage(msg);
                              fos.close();
                              is.close();
      
                          }
                      } catch (MalformedURLException e) {
                          e.printStackTrace();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
      
                  }
              }).start();
      
          }
      Handler handler=new Handler(){
              @Override
              public void handleMessage(Message msg) {
                  super.handleMessage(msg);
                  switch(msg.what){
                      case 1:
                          Toast.makeText(MainActivity.this, "保存图片成功", Toast.LENGTH_LONG).show();
                          break;
                      case 2:
                          Toast.makeText(MainActivity.this,"保存MP3成功",Toast.LENGTH_LONG).show();
                          break;
                      case 3:
                          Toast.makeText(MainActivity.this,"保存视频成功",Toast.LENGTH_SHORT).show();
                      default:
                          break;
                  }
              }
          };

        

    2.post方式  

    • 操作跟get差不多,除了post传递信息是通过正文传递的,而get是放在连接中的
    • new Thread(new Runnable() {
                      @Override
                      public void run() {
                          try {
                              //首先要支出服务器的地址
                              URL url=new URL("http://192.168.106.1/day10_NetworkServer/servlet/loginInfo");
                              //通过http连接
                              HttpURLConnection httpurlConnection = (HttpURLConnection) url.openConnection();
                              //设置请求方式,并设置等待响应时间
                              httpurlConnection.setRequestMethod("POST");
                              httpurlConnection.setConnectTimeout(5000);
      
                              String data="username="+username+"&password="+password+"&email="+email+"&phonenumber="+phonenumber;
                              OutputStream outputStream = httpurlConnection.getOutputStream();
                              outputStream.write(data.getBytes());
                              //把当前的request发送到服务器(安卓不允许在主线程内做耗时操作,如连接服务器)
                              httpurlConnection.connect();
                              //发送完连接后等待操作,这个是阻塞式方法,
                              int responseCode = httpurlConnection.getResponseCode();
      
                              //根据得到的响应代码和response的信息作出相应的操作
                              if(responseCode==200){
                                  //从服务器读取正确与否的信息
                                  InputStream is=httpurlConnection.getInputStream();
                                  byte[] buffer=new byte[1024];
                                  int read = is.read(buffer);
                                  String result=new String(buffer,0,read);
                                  //由于子线程不允许做UI更新操作,与要通过Handler进行和主线程的通信操作
                                  Message msg=new Message();
                                  msg.what=1;
                                  handler.sendMessage(msg);
      
                              }else{
                                  Message msg=new Message();
                                  msg.what=-1;
                                  handler.sendMessage(msg);
                              }
                          } catch (MalformedURLException e) {
                              e.printStackTrace();
                          } catch (IOException e) {
                              e.printStackTrace();
                          }
      
                      }
                  }).start();

     3.通过  

      

时间: 2024-11-05 12:33:20

Android网络操作的几种方法的相关文章

android 实现分享功能两种方法

当我想做一个智能的记事本的时候,我就在尝试自己写一组分享功能.后来才知道,原来每个社交软件中都有自己的分享接口. 这就大大减少了我们的代码量了. 第一种方法:特点--简单 package com.example.share; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuI

android 定位一般有四种方法

android 定位一般有四种方法,这四种方式分别是:GPS定位,WIFI定准,基站定位,AGPS定位,                             (1)Android GPS:需要GPS硬件支持,直接和卫星交互来获取当前经纬度,这种方式需要手机支持GPS模块(现在大部分的智能机应该都有了).通过GPS方式准确度是最高的,但是它的缺点也非常明显:1,比较耗电:2,绝大部分用户默认不开启GPS模块:3,从GPS模块启动到获取第一次定位数据,可能需要比较长的时间:4,室内几乎无法使用.

Android 更新UI的两种方法——handler和runOnUiThread() - $firecat的代码足迹$ - 博客频道 - CSDN.NET

文章来源:http://www.2cto.com/kf/201302/190591.html Android 更新UI的两种方法——handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面显示常会报错.抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread th

Android 创建单例模式的几种方法

java模式之单例模式:单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.特点:1,一个类只能有一个实例2,自己创建这个实例3,整个系统都要使用这个实例 Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在.在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作.一些资源管理器常常设计成单例模式.外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中.每台计算

Android 更新UI的两种方法——handler和runOnUiThread(

Android 更新UI的两种方法——handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面显示常会报错.抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views

探讨android更新UI的几种方法

作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽.我们会发现,自己越来越消极怠工,只是在无意义的敲代码,敲的还是网上抄来的代码,如果不行,继续找. 这就是项目进度没有规划好而导致的. 最近在做有关蓝牙的项目,一开始的进度都安排得很顺利,但是因为测试需要两部手机,而且还要是android手机,暑假已经开始了,同学们都回家了,加上我手机的蓝牙坏了,导致我的进度严重被打乱!而

[Android] Android 定时任务实现的三种方法(以SeekBar的进度自动实现为例)

一.采用Handler与线程的sleep(long)方法 二.采用Handler与timer及TimerTask结合的方法 三.采用Handler的postDelayed(Runnable, long)方法  布局文件: activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.c

打开网络适配的两种方法

打开网络适配有两种方法 第一种是在Info.plist文件里添加XML代码 具体步骤:右击Info.plist文件 选择Open As里面的Source Code 然后在文件底部插入下面代码 [html] view plain copy <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 第二种

PHP实现链式操作的三种方法详解

这篇文章主要介绍了PHP实现链式操作的三种方法,结合实例形式分析了php链式操作的相关实现技巧与使用注意事项,需要的朋友可以参考下 本文实例讲述了PHP实现链式操作的三种方法.分享给大家供大家参考,具体如下: 在php中有很多字符串函数,例如要先过滤字符串收尾的空格,再求出其长度,一般的写法是: strlen(trim($str)) 如果要实现类似js中的链式操作,比如像下面这样应该怎么写? $str->trim()->strlen() 下面分别用三种方式来实现: 方法一.使用魔法函数__ca