下载文件时,我向用户显示此进度条,右侧单击取消按钮,然后下载文件取消和 sdcard 删除下载文件。如何在 android 中实现?我的代码如下:
public class MyListAdapter extends BaseAdapter {
private LayoutInflater mInflater;
//DownloadFileFromURL ddl = new DownloadFileFromURL();
DownloadFileFromURL ddl;
public MyListAdapter(Context context) {
mInflater = LayoutInflater.from(context);
ddl = new DownloadFileFromURL();
}
public int getCount() {
return list.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View convertView,
ViewGroup parent) {
convertView = mInflater.inflate(R.layout.custome_list_view, null);
final Button cl = (Button) convertView
.findViewById(R.id.cancle_sedual);
final Button dl = (Button) convertView
.findViewById(R.id.download_sedual);
final ProgressBar pr = (ProgressBar) convertView
.findViewById(R.id.listprogressbar);
final ImageView im = (ImageView) convertView
.findViewById(R.id.list_image);
im.setImageResource(list.get(position).images[position]);
getProgress(pr, position, cl, dl);
// pr.setProgress(getItem(position));
cl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
dl.setVisibility(View.VISIBLE);
cl.setVisibility(View.GONE);
//ddl.cancel(true);
//new DownloadFileFromURL().cancel(true);
ddl.downloadFile();
}
});
dl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
str_start = list.get(position).url_video;
dl.setVisibility(View.GONE);
cl.setVisibility(View.VISIBLE);
Log.v("log_tag", "str_start " + str_start);
//
// new DownloadFileFromURL().execute(str_start);
// new DownloadFileFromURL().execute(pr, str_start,
// position);
//ddl.execute(pr, str_start, position);
ddl.execute(pr, str_start, position);
}
});
return convertView;
}
}
class DownloadFileFromURL extends AsyncTask<Object, String, Integer> {
int count = 0;
ProgressDialog dialog;
ProgressBar progressBar;
int myProgress;
int position;
boolean download1 = false;
/**
* Before starting background thread Show Progress Bar Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
ProgressBar progressBar;
download1 = true;
}
/**
* Downloading file in background thread
* */
@Override
protected Integer doInBackground(Object... params) {
Log.v("log_tag", "params :::; " + params);
int count;
progressBar = (ProgressBar) params[0];
position = (Integer) params[2];
try {
// URL url = new URL(f_url[0]);
URL url = new URL((String) params[1]);
Log.v("log_tag", "name ::: " + url);
name = ((String) params[1]).substring(((String) params[1])
.lastIndexOf("/") + 1);
Log.v("log_tag", "name Substring ::: " + name);
URLConnection conection = url.openConnection();
conection.connect();
// getting file length
int lenghtOfFile = conection.getContentLength();
// input stream to read file - with 8k buffer
InputStream input = new BufferedInputStream(url.openStream(),
8192);
download = new File(Environment.getExternalStorageDirectory()
+ "/download/");
if (!download.exists()) {
download.mkdir();
}
String strDownloaDuRL = download + "/" + name;
Log.v("log_tag", " down url " + strDownloaDuRL);
FileOutputStream output = new FileOutputStream(strDownloaDuRL);
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
if(this.download1){
// if(!DownloadFileFromURL.isCancelled())
// {
total += count;
// publishing the progress....
// After this onProgressUpdate will be called
// publishProgress("" + (int) ((total * 100) /
// lenghtOfFile));
// writing data to file
progressBar
.setProgress((int) ((total * 100) / lenghtOfFile));
output.write(data, 0, count);
setProgress(progressBar, position);
}
else {
break;
}
}
// flushing output
output.flush();
if(!this.download1){
File delete = new File(strDownloaDuRL);
delete.delete();
}
// closing streams
output.close();
input.close();
} catch (Exception e) {
Log.e("Error: ", e.getMessage());
}
return 0;
}
public void downloadFile(){
this.download1 = false;
}
/**
* Updating progress bar
* */
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
Log.v("log_tag", "progress :: " + values);
// setting progress percentage
// pDialog.setProgress(Integer.parseInt(progress[0]));
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url) {
Log.v("log", "login ::: 4::: " + download);
String videoPath = download + "/" + name;
String chpName = name;
Log.v("log_tag", "chpName ::::" + chpName + " videoPath "
+ videoPath);
db.execSQL("insert into videoStatus (chapterNo,videoPath) values(\""
+ chpName + "\",\"" + videoPath + "\" )");
}
}
private void setProgress(ProgressBar pr, int position) {
ProgressBarSeek pbarSeek = new ProgressBarSeek();
pbarSeek.setPosition(position);
pbarSeek.setProgressValue(pr.getProgress());
Log.v("log_tag", position + " progress " + pr.getProgress());
progreeSeekList.add(pbarSeek);
}
private void getProgress(ProgressBar pr, int position, Button cl, Button dl) {
if (progreeSeekList.size() > 0) {
for (int j = 0; j < progreeSeekList.size(); j++) {
if (position == progreeSeekList.get(j).getPosition()) {
pr.setProgress(progreeSeekList.get(j).getProgressValue());
dl.setVisibility(View.GONE);
cl.setVisibility(View.VISIBLE);
}
}
}
}
然后我点击取消按钮然后我得到下面的错误:
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): FATAL EXCEPTION: main
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): java.lang.IllegalStateException: Cannot execute task: the task is already running.
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): at android.os.AsyncTask.execute(AsyncTask.java:380)
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): at com.example.testhopelistnew.TestHopeListNew$MyListAdapter$2.onClick(TestHopeListNew.java:144)
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): at android.view.View.performClick(View.java:2485)
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): at android.view.View$PerformClick.run(View.java:9080)
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): at android.os.Handler.handleCallback(Handler.java:587)
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): at android.os.Handler.dispatchMessage(Handler.java:92)
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): at android.os.Looper.loop(Looper.java:130)
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): at android.app.ActivityThread.main(ActivityThread.java:3687)
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): at java.lang.reflect.Method.invokeNative(Native Method)
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): at java.lang.reflect.Method.invoke(Method.java:507)
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
02-25 12:49:31.109: ERROR/AndroidRuntime(25082): at dalvik.system.NativeStart.main(Native Method)