欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现简单的文件下载与上传

程序员文章站 2022-08-20 16:21:03
文件下载 /** * 下载服务 intentservice * 生命周期: * 1>当第一次启动intentservice时,android容...

文件下载

/**
 * 下载服务 intentservice 
 * 生命周期:
 * 1>当第一次启动intentservice时,android容器
 *  将会创建intentservice对象。
 * 2>intentservice将会在工作线程中轮循消息队列,
 *  执行每个消息对象中的业务逻辑。
 * 3>如果消息队列中依然有消息,则继续执行,
 *  如果消息队列中的消息已经执行完毕,
 *  intentservice将会自动销毁,执行ondestroy方法。
 */
public class downloadservice extends intentservice{
  private static final int notification_id = 100;
  public downloadservice(){
    super("download");
  }
  public downloadservice(string name) {
    super(name);
  }
  /**
   * 该方法中的代码将会在工作线程中执行
   * 每当调用startservice启动intentservice后,
   * intentservice将会把onhandlerintent中的
   * 业务逻辑放入消息队列等待执行。
   * 当工作线程轮循到该消息对象时,将会
   * 执行该方法。
   */
  protected void onhandleintent(intent intent) {
    //发送http请求 执行下载业务
    //1. 获取音乐的路径
    string url=intent.getstringextra("url");
    string bit=intent.getstringextra("bit");
    string title=intent.getstringextra("title");
    //2. 构建file对象,用于保存音乐文件
    //   /mnt/sdcard/music/_64/歌名.mp3
    file targetfile = new file(environment.getexternalstoragepublicdirectory(environment.directory_music),"_"+bit+"/"+title+".mp3" );         
    if(targetfile.exists()){
      log.i("info", "音乐已存在");
      return;
    }
    if(!targetfile.getparentfile().exists()){
      targetfile.getparentfile().mkdirs();
    }
    try {
      sendnotification("音乐开始下载", "音乐开始下载");
      //3. 发送http请求,获取inputstream
      inputstream is = httputils.getinputstream(url);
      //4. 边读取边保存到file对象中
      fileoutputstream fos = new fileoutputstream(targetfile);
      byte[] buffer = new byte[1024*100];
      int length=0;
      int current = 0;
      int total = integer.parseint(intent.getstringextra("total"));
      while((length=is.read(buffer)) != -1){
        fos.write(buffer, 0, length);
        fos.flush();
        current += length;
        //通知下载的进度
        double progress = math.floor(1000.0*current/total)/10;
        sendnotification("音乐开始下载", "下载进度:"+progress+"%");
      }
      //5. 文件下载完成
      fos.close();
      cancelnotification(); //重新出现滚动消息
      sendnotification("音乐下载完成", "音乐下载完毕");
    } catch (exception e) {
      e.printstacktrace();
    }
  }
  /**
   * 发通知
   */
  public void sendnotification(string ticker, string text){
    notificationmanager manager = (notificationmanager) getsystemservice(notification_service);
    notification.builder builder = new notification.builder(this);
    builder.setsmallicon(r.drawable.ic_launcher)
      .setcontenttitle("音乐下载")
      .setcontenttext(text)
      .setticker(ticker);
    notification n = builder.build();
    manager.notify(notification_id, n);
  }
  /**
   * 取消通知
   */
  public void cancelnotification(){
    notificationmanager manager = (notificationmanager) getsystemservice(notification_service);
    manager.cancel(notification_id);
  }    
}

文件上传

 /** 
   * 上传文件 
   * @param uploadfile 
   */ 
  private void uploadfile(final file uploadfile) { 
    new thread(new runnable() {      
      @override 
      public void run() { 
        try { 
          uploadbar.setmax((int)uploadfile.length()); 
          string souceid = logservice.getbindid(uploadfile); 
          string head = "content-length="+ uploadfile.length() + ";filename="+ uploadfile.getname() + ";sourceid="+ 
            (souceid==null? "" : souceid)+"\r\n"; 
          socket socket = new socket("192.168.1.78",7878); 
          outputstream outstream = socket.getoutputstream(); 
          outstream.write(head.getbytes()); 
          pushbackinputstream instream = new pushbackinputstream(socket.getinputstream());   
          string response = streamtool.readline(instream); 
          string[] items = response.split(";"); 
          string responseid = items[0].substring(items[0].indexof("=")+1); 
          string position = items[1].substring(items[1].indexof("=")+1); 
          if(souceid==null){//代表原来没有上传过此文件,往数据库添加一条绑定记录 
            logservice.save(responseid, uploadfile); 
          } 
          randomaccessfile fileoutstream = new randomaccessfile(uploadfile, "r"); 
          fileoutstream.seek(integer.valueof(position)); 
          byte[] buffer = new byte[1024]; 
          int len = -1; 
          int length = integer.valueof(position); 
          while(start&&(len = fileoutstream.read(buffer)) != -1){ 
            outstream.write(buffer, 0, len); 
            length += len; 
            message msg = new message(); 
            msg.getdata().putint("size", length); 
            handler.sendmessage(msg); 
          } 
          fileoutstream.close(); 
          outstream.close(); 
          instream.close(); 
          socket.close(); 
          if(length==uploadfile.length()) logservice.delete(uploadfile); 
        } catch (exception e) { 
          e.printstacktrace(); 
        } 
      } 
    }).start(); 
  } 
} 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接