您的位置:首页 > 移动开发 > Android开发

Android多线程断点下载

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

这个是主界面,就一个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: