Android多线程断点下载

最近在看多线程断点下载,在网上找了好多例子,各种各样的,大同小异,本文是根据网上源码改编而来,改变了整体效果和一下细小的调整,

这个是主界面,就一个listview

package com.lx.multithread.activity;


import java.util.ArrayList;
import java.util.List;


import com.lx.multithread.FileDownloader;
import com.lx.multithread.R;
import com.lx.multithread.adapter.DownListAdapter;
import com.lx.multithread.db.DatabaseUtil;
import com.lx.multithread.entity.ApkInfoData;


import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ListView;


public class DownLoadActivity extends Activity {
private String url1 = "http://update.android.doplive.com.cn/dopoolv2.4.player.apk";


private String url2 = "http://www.ipmsg.org.cn/downloads/ipmsg.apk";


private String url3 = "http://down1.cnmo.com/app/a135/aiku_2.0.apk";


private ListView listView;
private DownListAdapter adapter;
private List<ApkInfoData> list = new ArrayList<ApkInfoData>();
private List<String> str = new ArrayList<String>();
private DatabaseUtil databaseUtil;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.down_layout);
databaseUtil = new DatabaseUtil(this); // context设置需思考
initView();
}


private void initView() {
listView = (ListView) findViewById(R.id.down_list);
str.add(url1);
str.add(url2);
str.add(url3);
new getFile().start();
}


private class getFile extends Thread {
@Override
public void run() {
list = FileDownloader.getAPKInfo(str, databaseUtil);
Message message = new Message();
message.what = 0;
handler.sendMessage(message);
}
}


private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
adapter = new DownListAdapter(DownLoadActivity.this, list);
listView.setAdapter(adapter);
break;


default:
break;
}
};
};
}


自定义的adapter

package com.lx.multithread.adapter;


import java.io.File;
import java.util.List;


import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;


import com.lx.multithread.CompleteListener;
import com.lx.multithread.FileDownloader;
import com.lx.multithread.R;
import com.lx.multithread.entity.ApkInfoData;
import com.lx.multithread.util.SystemUtil;


public class DownListAdapter extends BaseAdapter {


private List<ApkInfoData> list;
private LayoutInflater inflater;
private viewHolder holder;


private Context context;


public DownListAdapter(Context context, List<ApkInfoData> list) {
this.list = list;
this.context = context;


inflater = LayoutInflater.from(context);
}


@Override
public int getCount() {
return list.size();
}


@Override
public Object getItem(int arg0) {
return list.get(arg0);
}


@Override
public long getItemId(int arg0) {
return arg0;
}


@Override
public View getView(final int position, View convertView, ViewGroup arg2) {
ApkInfoData data = list.get(position);
holder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_down_list, null);
holder = new viewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (viewHolder) convertView.getTag();
}


holder.textView.setText(list.get(position).getName());
holder.sizeText.setText(list.get(position).getFileSize());
holder.button.setOnClickListener(new MyListener(holder.downBar,
holder.progText, data.getUrl(), holder.sizeText));
holder.downBar.setMax(data.getLength());
if (data.getProgress() != 0) {
holder.downBar.setProgress(data.getProgress());
holder.sizeText.setText(data.getFileSize() + "/"
+ SystemUtil.convertFileSize(data.getProgress()));
holder.progText.setText(data.getProgress() * 100 / data.getLength()
+ "%");
}


if (holder.downBar.getProgress() == 0) {
holder.button.setText("开始");
} else if (holder.downBar.getProgress() == holder.downBar.getMax()) {
holder.button.setText("安装");
} else {
holder.button.setText("开始");
}
return convertView;
}


class viewHolder {
public TextView textView;
public TextView progText;
public TextView sizeText;
public Button button;
public ProgressBar downBar;


public viewHolder(View view) {
textView = (TextView) view.findViewById(R.id.down_name);
sizeText = (TextView) view.findViewById(R.id.down_size);
progText = (TextView) view.findViewById(R.id.down_prog);
button = (Button) view.findViewById(R.id.btn_start);
downBar = (ProgressBar) view.findViewById(R.id.down_bar);
}
}


class MyListener implements OnClickListener {
private ProgressBar pb;
private TextView tv;
private TextView sizeText;
private String url;
private FileDownloader fileDownloader;


public MyListener(ProgressBar pb, TextView tv, String url,
TextView sizeText) {
this.pb = pb;
this.tv = tv;
this.url = url;
this.sizeText = sizeText;
}


@SuppressLint("HandlerLeak")
public void onClick(View v) {
final Button pauseButton = (Button) v;
final Handler mainHandler = new Handler() {


@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 2:
pauseButton.setText("安装");
break;
}
}


};
if (pauseButton.getText().equals("开始")) {
pauseButton.setText("暂停");
new Thread() {
public void run() {
try {
fileDownloader = new FileDownloader(url, handler,
context);
fileDownloader.Download(new CompleteListener() {
public void isComplete(int size) {
Message msg = new Message();
msg.what = 2;
mainHandler.sendMessage(msg);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
} else if (pauseButton.getText().equals("暂停")) {


fileDownloader.setPause();
pauseButton.setText("继续");
} else if (pauseButton.getText().equals("继续")) {
pauseButton.setText("暂停");
new Thread() {
public void run() {
try {
fileDownloader.setResume(new CompleteListener() {
public void isComplete(int size) {
Message msg = new Message();
msg.what = 2;
mainHandler.sendMessage(msg);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
} else if (pauseButton.getText().equals("安装")) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
String installPath = Environment.getExternalStorageDirectory()
+ "/" + url.substring(url.lastIndexOf('/') + 1);
intent.setDataAndType(Uri.fromFile(new File(installPath)),
"application/vnd.android.package-archive");
context.startActivity(intent);
}
}


private Handler handler = new Handler() {
int fileLength = 1;


@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0: // 得到进度条的最大长度
fileLength = msg.getData().getInt("filelength");
pb.setMax(fileLength); // 设置进度条最大长度
break;
case 1: // 设置进度条现在的长度
int currentLength = msg.getData().getInt("currentlength");
pb.setProgress(currentLength); // 设置当前进度条长度
if (fileLength != 0) {
tv.setText(currentLength * 100 / fileLength + "%");
sizeText.setText(SystemUtil.convertFileSize(fileLength)
+ "/"
+ SystemUtil.convertFileSize(currentLength));
if (currentLength == fileLength) {
tv.setText(currentLength * 100 / fileLength + "%");
}
}
break;
default:
}
}
};


}
}

还有的去下载源码吧

http://download.csdn.net/detail/zx302560625/8340851

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值