线程断点续传,可加入消息队列排队下载

package com.accp.pageload.view;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import com.accp.pageload.net.JudgeNet;
import com.accp.pageload.utils.Const;
import com.accp.pageload.utils.FileUtility;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;

public class DownLoadingActivity extends Activity {
 private Button mStart;
 private Button mPause;
 private ProgressBar mPro;
 private Button start2;
 private int mFileSize;
 private int mHasdownload;
 private HandlerThread handlerthread;
 private MyHandler my;
 private boolean mIspause = false;
 private RandomAccessFile mAccessFile;
 private int mFirstFileSize;
 private int mIndex = 1;
 private int mResult;
 private int i = 1;
 private Handler mHandler;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.download);
  handlerthread = new HandlerThread("hand_thread");
  handlerthread.start();
  my = new MyHandler(handlerthread.getLooper());
  init();
  judgeNet();
 }

 public void init() {
  mStart = (Button) findViewById(R.id.start);
  mPause = (Button) findViewById(R.id.pause);
  mPro = (ProgressBar) findViewById(R.id.pro);
  start2 = (Button) findViewById(R.id.start2);
  mPro.setMax(100);
  // result = getShareProgress("progress");
  // first = getShareFileSize("fileSize");
  // pro.setProgress(result);
  // hasdownload = result / 100 * first;
  mStart.setOnClickListener(new OnClickListener() {
   public void onClick(View v) {
    try {
     Message mes = new Message();
     mes.obj = "http://192.168.1.20/download/%e6%b5%aa%e6%bd%ae.pdf";
     mes.what = i;
     my.sendMessage(mes);
     System.out.println("亲,您进入了message");
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  });
  start2.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Message mes = new Message();
    mes.obj = "http://192.168.1.20/download/%e6%b5%aa%e6%bd%ae.pdf";
    my.sendMessage(mes);
   }
  });
  mPause.setOnClickListener(new OnClickListener() {
   public void onClick(View v) {
    mIspause = true;
    mStart.setClickable(true);
   }
  });
 }

 class MyHandler extends Handler {
  public MyHandler() {

  }

  public MyHandler(Looper looper) {
   super(looper);
  }

  @Override
  public void handleMessage(Message msg) {
   mIspause = false;
   int length;
   URL url;
   System.out.println(msg.obj.toString());
   try {
    if (msg.what > 0) {
     url = new URL(msg.obj.toString());
     HttpURLConnection http = (HttpURLConnection) url
       .openConnection();
     http.setConnectTimeout(100000);
     http.setRequestMethod("GET");
     http.setRequestProperty("Range", "bytes=" + mHasdownload
       + "-");
     if (http.getResponseCode() == 206) {
      mFileSize = http.getContentLength();
      if (mIndex == 1) {
       mFirstFileSize = mFileSize;
       mIndex++;
      }
      FileUtility fileUtil = new FileUtility();
      File parent = fileUtil
        .createAlbumRootSDDir(Const.FOLDERNAME);
      File file = fileUtil.createAlbumDir("baidu.pdf");
      BufferedInputStream buffer = new BufferedInputStream(
        http.getInputStream());
      byte[] bufferByte = new byte[100000];
      mAccessFile = new RandomAccessFile(file, "rwd");
      mAccessFile.setLength(mFileSize);
      mAccessFile.seek(mHasdownload);
      while ((length = (buffer.read(bufferByte))) != -1) {
       if (mIspause == true) {
        break;
       }
       mHasdownload += length;
       mResult = (int) ((float) mHasdownload
         / (float) mFirstFileSize * 100);
       mAccessFile.write(bufferByte, 0, length);
       Message ms = new Message();
       ms.arg1 = mResult;
       ms.arg2 = 1;
       hand.sendMessage(ms);
       try {
        Thread.sleep(1000);
       } catch (InterruptedException e) {
        e.printStackTrace();
       }
      }
      mAccessFile.close();
     }
     http.disconnect();
    }
   } catch (MalformedURLException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }

 class MyThread extends Thread {
  private String downLoadUrl;
  private int fileId;
  private int hasDownLoad;

  public MyThread(String url, int fileId, int hasDownLoad) {
   this.downLoadUrl = url;
   this.fileId = fileId;
   this.hasDownLoad = hasDownLoad;
  }

  @Override
  public void run() {
   super.run();
   Looper.prepare();
   mHandler = new Handler() {

    @Override
    public void handleMessage(Message msg) {
     // TODO Auto-generated method stub
     super.handleMessage(msg);
     // mStart.setClickable(false);
     mIspause = false;
     int length;
     URL url;
     try {
      url = new URL(downLoadUrl);
      HttpURLConnection http = (HttpURLConnection) url
        .openConnection();
      http.setConnectTimeout(100000);
      http.setRequestMethod("GET");
      http.setRequestProperty("Range", "bytes="
        + mHasdownload + "-");
      if (http.getResponseCode() == 206) {
       mFileSize = http.getContentLength();
       if (mIndex == 1) {
        mFirstFileSize = mFileSize;
        // pro.setMax(first);
        mIndex++;
       }
       FileUtility fileUtil = new FileUtility();
       File parent = fileUtil
         .createAlbumRootSDDir(Const.FOLDERNAME);
       File file = fileUtil.createAlbumDir("baidu.pdf");
       BufferedInputStream buffer = new BufferedInputStream(
         http.getInputStream());
       byte[] bufferByte = new byte[100000];
       mAccessFile = new RandomAccessFile(file, "rwd");
       mAccessFile.setLength(mFileSize);
       mAccessFile.seek(mHasdownload);
       while ((length = (buffer.read(bufferByte))) != -1) {
        if (mIspause == true) {
         break;
        }
        mAccessFile.write(bufferByte, 0, length);
        mHasdownload += length;
        mResult = (int) ((float) mHasdownload
          / (float) mFirstFileSize * 100);
        Message m = new Message();
        m.arg1 = mResult;
        m.arg2 = 1;
        hand.sendMessage(m);
        try {
         Thread.sleep(1000);
        } catch (InterruptedException e) {
         e.printStackTrace();
        }
       }
       mAccessFile.close();
      }
      http.disconnect();
     } catch (MalformedURLException e) {
      e.printStackTrace();
     } catch (IOException e) {
      e.printStackTrace();
     }
    }

   };

   Looper.loop();
  }
 }

 Handler hand = new Handler() {
  @Override
  public void handleMessage(Message msg) {
   super.handleMessage(msg);
   switch (msg.arg2) {
   case 1:
    mPro.setProgress(msg.arg1);
    if (mPro.getProgress() == 100) {
     Toast.makeText(DownLoadingActivity.this, "下载已完成!", 3000)
       .show();
     // saveProgressInShare("progress", hasdownload);
    }
    break;
   case 2:
    Thread runnable = (Thread) msg.obj;
    runnable.start();
    break;
   }
  }
 };

 @Override
 public void onBackPressed() {
  super.onBackPressed();
  mIspause = true;
  // if (!MyThread.currentThread().isInterrupted()) {
  // MyThread.currentThread().interrupt();
  // }
  System.out.println("已经下载" + mResult);
  saveProgressInShare("progress", mResult, "fileSize", mFirstFileSize);
 }

 public void saveProgressInShare(String shareName, int hasdownload,
   String File, int fileSize) {
  SharedPreferences share = getSharedPreferences("share",
    Context.MODE_PRIVATE);
  share.edit().putInt(shareName, hasdownload).commit();
  share.edit().putInt(File, fileSize).commit();
 }

 public int getShareProgress(String shareName) {
  SharedPreferences shar = getSharedPreferences("share",
    Context.MODE_PRIVATE);
  return shar.getInt(shareName, 0);
 }

 public int getShareFileSize(String fileName) {
  SharedPreferences shar = getSharedPreferences("share",
    Context.MODE_PRIVATE);
  return shar.getInt(fileName, 0);
 }

 public void judgeNet() {
  NetworkInfo netInfo = JudgeNet.getActiveNetwork(this);
  if (netInfo == null) {
   mIspause = true;
   // if (!MyThread.currentThread().isInterrupted()) {
   // MyThread.currentThread().interrupt();
   // }
   saveProgressInShare("progress", mHasdownload, "fileSize",
     mFirstFileSize);
   AlertDialog.Builder builder = new AlertDialog.Builder(this);
   builder.setTitle("提示")
     .setMessage("网络连接失败!")
     .setPositiveButton("确定",
       new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog,
          int which) {
         Intent intent = new Intent(
           "android.settings.WIRELESS_SETTINGS");
         startActivity(intent);

        }
       }).create().show();
  } else if (netInfo.getState().equals(
    NetworkInfo.DetailedState.CONNECTED)) {
   mStart.setClickable(true);
   mPause.setClickable(true);
  } else if (netInfo.getState().equals(
    NetworkInfo.DetailedState.CONNECTING)) {
   System.out.println("正在连接中");
  }
 }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值