多线程下载JAVA代码移植到android 添加下载进度条跟踪

public class MainActivity extends Activity {
    protected static final int DOWN = 0;
    protected static final int SEER = 1;
    private Context context;
    private EditText ed;
    private ProgressBar pb;
    public static int threadcount=3;
    public static int runnling=3;
    public int  cureatProcess=0;//当前进度
    private Handler handler =new Handler(){
        public void handleMessage(android.os.Message msg) {
         switch (msg.what) {
        case  DOWN:
            Toast.makeText(getApplicationContext(), "下载错误", 0).show();
            break;

        case SEER:
            Toast.makeText(getApplicationContext(), "下载失败", 0).show();
            break;
        }
            
            
        };
        
        
        
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ed=(EditText)findViewById(R.id.ed_path);
        pb=(ProgressBar)findViewById(R.id.pb);
    }

    
    public void paly(View view){
        final String path=ed.getText().toString().trim();
        if(TextUtils.isEmpty(path)){
            Toast.makeText(getApplicationContext(), "请输入地址", 0).show();
            return;
            
        }
        new Thread(){
            public void run(){
                
                //String path="http://down9.869v.com/setup_445.exe";
                 try {
                    URL url=new URL(path);
                             HttpURLConnection con= (HttpURLConnection) url.openConnection();
                              con.setReadTimeout(6000);
                              con.setRequestMethod("GET");
                           int code= con.getResponseCode();
                           if(code==200){
                              int length= con.getContentLength();//已经设置了请求的位置//返回的是当前位置对应文件的输入流
                              pb.setMax(length);//获取进度条最大值
                              RandomAccessFile raf=new RandomAccessFile((/"sdscard"/+"421.exe", "rwd");//记录当前线程下载的数据长度
                              raf.close();
                              
                              //System.out.print("文件长度:"+length);
                               int bolak =length/threadcount;
                               for(int threadID=1;threadID<=threadcount;threadID++){
                                   int starIndex=(threadID-1)*bolak;
                                   int endIndex=threadID*bolak-1;
                                   if(threadID==threadcount){
                                       endIndex=length;
                                    
                                       
                                   }
                                   System.out.println("线程"+threadID+"下载---->"+starIndex+"----->"+endIndex);
                                   new MyThread(path, threadID, starIndex, endIndex).start();
                               }
                           }else{
                               System.out.print("读取长度失败");
                               Message msg=new Message();
                               handler.sendMessage(msg);
                               msg.what=SEER;
                           }
                } catch (Exception e) {
            e.printStackTrace();
            Message msg=new Message();
            handler.sendMessage(msg);
            msg.what=DOWN;
            
                }
                
            }
            
            
            
        }.start();
        
        
        
    }
     public  class MyThread extends Thread{
           public MyThread(String path, int threadID, int starIndex, int endIndex) {
            super();
            this.path = path;
            this.threadID = threadID;
            this.starIndex = starIndex;
            this.endIndex = endIndex;
        }
        private String path;  
           private int threadID;
           private int starIndex;
           private int endIndex;
        
        
        
    
      public void run(){
           
        try {
            //检查是否在记录下载长度的文件 如果存在读取这个文件的数据
           File tempFile =new File(context.MODE_PRIVATE+threadID+".txt");
            if(tempFile.exists()&&tempFile.length()>0){
            FileInputStream fis=new FileInputStream(tempFile);
            byte[] tpem=new byte[1024];
            int leng =fis.read(tpem);
            String dowmlod =new String(tpem,0,leng);
            int downlodalenInt= Integer.parseInt(dowmlod);
            int alreadyDown =downlodalenInt-starIndex;
            cureatProcess+=alreadyDown;//计算上次断点已经下载的值
            starIndex=downlodalenInt;//修改下载的真实开始位置
            fis.close();
            }    
            
            URL url=new URL(path);
           HttpURLConnection con =(HttpURLConnection) url.openConnection();
           con.setRequestMethod("GET");
           con.setRequestProperty("Range", "byte="+starIndex+"-"+endIndex);
           System.out.println("线程真实下载位置"+threadID+"下载----"+starIndex);
           con.setReadTimeout(8000);
           
           int code=con.getResponseCode();
           System.out.println("code"+code);
           InputStream is= con.getInputStream();
           RandomAccessFile raf=new RandomAccessFile((/"sdscard"/+"421.exe", "rwd");
           raf.seek(starIndex);
           int len=0;
           byte[]buffer=new byte[1024];
           int total=0;
           while((len=is.read(buffer))!=-1){
             RandomAccessFile flie =new RandomAccessFile((/"sdscard"/+threadID+".txt ","rwd");
             raf.write(buffer,0,len);
               total+=len;
               System.out.println("线程"+threadID+"total:"+total);
              flie.write((total+starIndex+"").getBytes());//记录下载的位置
              flie.close();
              synchronized (MainActivity.this) {
                cureatProcess+=len;//记录当前总进度
                pb.setProgress(cureatProcess);
                   
            }
           }
           is.close();
           raf.close();
           System.out.println("线程ID"+threadID+"下载完毕......");
        } catch (Exception e) {
            
            e.printStackTrace();
        }finally{
            threadFins();
            
        }
          
      }




    private synchronized void threadFins() {
        runnling--;
        if(runnling==0){
            for(int i=1 ;i<=3;i++){
                File file=new File(/"sdscard"/+i+".txt");
                file.delete();
                
            }
            System.out.println("文件下载完毕删除所有下载记录");
        }
    }
      }
    
    
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值