最近在看多线程断点下载,在网上找了好多例子,各种各样的,大同小异,本文是根据网上源码改编而来,改变了整体效果和一下细小的调整,
这个是主界面,就一个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