您的位置:首页 > 其它

多线程下载

2017-11-23 11:15 127 查看
第一步:加权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

第二步:

public class DownLoadUtils {
public static void setNet(String baseUrl, String path,int blockSize,int startPosition){
RandomAccessFile raf=null;
BufferedInputStream bis=null;
try {
File f=new File(path);
if(!f.exists()){
f.createNewFile();
}
URL url=new URL(baseUrl);
HttpURLConnection con=(HttpURLConnection) url.openConnection();
con.setReadTimeout(5000);
con.setConnectTimeout(5000);
if(blockSize>0){
long end=blockSize+startPosition-1;
con.setRequestProperty("Range","bytes="+startPosition+"-"+end);
Log.i("--------------", "setNet: "+startPosition+"-"+end);
}

int code = con.getResponseCode();
if(code<400){
bis = new BufferedInputStream(con.getInputStream());
raf=new RandomAccessFile(f,"rwd");
raf.seek(startPosition);
int len=0;
byte[] buff=new byte[1024*8];
while ((len=bis.read(buff))!=-1){
raf.write(buff,0,len);
if(DialogUtils.PROGRESS<0){
DialogUtils.PROGRESS=0;
}
DialogUtils.PROGRESS+=len;
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(bis!=null){
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(raf!=null){
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static int getFileLength(String baseUrl){
int length=0;
try {
URL url=new URL(baseUrl);
HttpURLConnection con=(HttpURLConnection) url.openConnection();
con.setReadTimeout(5000);
length=con.getContentLength();
} catch (Exception e) {
e.printStackTrace();
}
return length;
}
}


第三步:
public class DownTask extends Thread {
String downloadUrl;
String path;
int blockSize;
int startPosition;

public DownTask(String downloadUrl, String path, int blockSize, int startPosition) {
this.downloadUrl = downloadUrl;
this.path = path;
this.blockSize = blockSize;
this.startPosition = startPosition;
}

@Override
public void run() {
DownLoadUtils.setNet(downloadUrl,path,blockSize,startPosition);
}
}


第四步:
public class DownThread extends Thread {
private  String baseurl="";
private String path;
private  int threadNum=5;
int start;
int end;
public DownThread(String baseurl, String path) {
this.baseurl = baseurl;
this.path = path;
}

@Override
public void run() {
int len=DownLoadUtils.getFileLength(baseurl);
Log.i("----len--------", "run: len"+len);
DialogUtils.MAX=len;
int blockSize=len/threadNum;
for (int i = 0; i<threadNum ; i++) {
int startPosition=blockSize*i;
if(i==threadNum-1){
blockSize=len-blockSize*(threadNum-1);
}
new DownTask(baseurl,path,blockSize,startPosition).start();
}
}
}


第五步:
public class DialogUtils{
public static  long MAX =0 ;
public static  long PROGRESS = -2;
public  void getDialog(final Context context){
AlertDialog.Builder builder=new AlertDialog.Builder(context);
builder.setTitle("发现新版本");
builder.setIcon(R.mipmap.ic_launcher);
builder.setMessage("最新版本:V1.0.1.1686");
builder.setMessage("新版本大小:11.79MB");
builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
new DownThread("http://169.254.51.153:8080/com.taobao.taobao_161.apk", context.getCacheDir()+"/com.taobao.taobao_161.apk").start();
showProgress(context);
}
});

builder.setNegativeButton("以后在说",null);
builder.show();
}

public  void showProgress(final Context context){
final ProgressDialog pd=new ProgressDialog(context);
pd.setTitle("正在更新");
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMax(100);
pd.show();
new AsyncTask<String,Integer,String>(){

@Override
protected String doInBackground(String... params) {
while (PROGRESS+1<MAX){
//                    SystemClock.sleep(10);
if(MAX>0){
publishProgress((int)(PROGRESS * 100 / MAX));
}
};
return null;
}

@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
pd.dismiss();
}

@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
//                Log.i("--onProgressUpdate---", "onProgressUpdate: "+values[0]);
pd.setProgress(values[0]);
}
}.execute();
}

}
最后一步:
public class MainActivity extends AppCompatActivity {
    //sd卡:String localPath = Environment.getExternalStorageDirectory()
                .getAbsolutePath() + "/local";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DialogUtils dialogUtils=new DialogUtils();
        dialogUtils.getDialog(this);
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程下载