我正在使用AsyncTask和arrayList创建一个多下载器。我希望我的Android应用程序在我的应用程序的后台下载视频。这就是我创建应用程序类并在那里初始化我的下载arraylist的原因。我的下载列表视图正在完美地添加新项目,但是当添加新项目时,无论是完全下载还是部分下载,之前的项目都会开始再次下载。
这是我的应用程序类:
public class GlobalDownload extends Application {
private List<DownloadInfo> downloadinfo;
@Override
public void onCreate() {
super.onCreate();
downloadinfo = new ArrayList<DownloadInfo>();
}
public List<DownloadInfo> getDownloadInfo(){
return downloadinfo;
}
public String getDownloadStates()
{
return state;
}
}
以下是我的课程,其中列出了listview:
public class DownloadScreen extends Activity implements {
ListView listView;
Animation animationslidedown;
Animation animationslideup;
TextView textView2;
ImageView menu;
ImageView menuicon1;
String text="";
List<DownloadInfo> downloadInfo;
static final int REQUEST = 1;
public static String f_type;
public static Integer result;
DownloadInfoArrayAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.download_layout);
listView = (ListView) findViewById(R.id.downloadListView);
String file_name=getIntent().getStringExtra("FILE_NAME");
String file_type=getIntent().getStringExtra("FILE_TYPE").toString();
Log.e("file_type", "" + file_type);
if(file_type.equals("video/mp4"))
{
f_type="mp4";
}
else if(file_type.equals("video/webm"))
{
f_type="webm";
}
else if(file_type.equals("video/x-flv"))
{
f_type="flv";
}
else if(file_type.equals("video/3gpp"))
{
f_type="3gpp";
}
GlobalDownload downloadList = ((GlobalDownload)getApplicationContext());
ArrayList downloadState = (ArrayList) downloadList.getDownloadInfo();
Log.e("NAME", "" + file_name);
String file_url=getIntent().getStringExtra("FILE_URL");
Log.e("URL", "" + file_url);
String file_size=getIntent().getStringExtra("FILE_SIZE");
Log.e("SIZE", "" + file_size);
Log.e("TYPE", file_type.toString());
downloadState.add(new DownloadInfo(file_name,file_url,file_size,f_type.toString()));
listView.setAdapter(new DownloadInfoArrayAdapter(getApplicationContext(), R.id.downloadListView, downloadState));
}
}
以下是我的AsyncTask活动和ArrayAdapeter活动:
public class FileDownloadTask extends AsyncTask<String, Integer, Integer> {
// private static final String TAG = FileDownloadTask.class.getSimpleName();
final DownloadInfo mInfo;
TextView display;
public int progress;
public String encodedurl;
DownloadInfoArrayAdapter mAdapter;
public FileDownloadTask(DownloadInfo info) {
mInfo = info;
}
@Override
protected void onProgressUpdate(Integer... values) {
mInfo.setProgress(values[0]);
mInfo.setFilePercent(values[0]);
ProgressBar bar = mInfo.getProgressBar();
if (bar != null) {
bar.setProgress(mInfo.getProgress());
}
}
@Override
protected Integer doInBackground(String... params) {
int count;
if(mInfo.getDownloadState()!= DownloadInfo.DownloadState.COMPLETE)
{
try {
String root = Environment.getExternalStorageDirectory().toString();
System.out.println("Downloading");
//
URL url = new URL(mInfo.getFileUrl().toString());
Log.e("URL", "" + url);
HttpURLConnection conection = (HttpURLConnection) url.openConnection();
conection.connect();
Log.e("connection", " " + 0);
int lenghtOfFile = conection.getContentLength();
Log.e("length", "" + lenghtOfFile);
//input stream to read file - with 8k buffer
// Output stream to write file
File rootdirectory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), "Youtube Videos");
if (!rootdirectory.exists()) {
rootdirectory.mkdirs();
}
String nameoffile = mInfo.getFilename() + "." + mInfo.getFileType();
File file = new File(rootdirectory, nameoffile);
file.createNewFile();
Log.e("name of file", "" + nameoffile);
mInfo.setDownloadState(DownloadInfo.DownloadState.DOWNLOADING);
InputStream input = new BufferedInputStream(url.openStream(), 8192);
OutputStream output = new FileOutputStream(file);
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
progress = (int) ((total * 100) / lenghtOfFile);
publishProgress(progress);
Log.e("PROGRESS", "" + mInfo.getFileType() + progress);
mInfo.setFilePercent(progress);
// writing data to file
output.write(data, 0, count);
}
// flushing output
output.flush();
// closing streams
output.close();
input.close();
Log.e("Download Complete", "" + 0);
} catch (Exception e) {
Log.e("Error: ", e.getMessage());
}
mInfo.setDownloadState(DownloadInfo.DownloadState.COMPLETE);
}
return progress;
}
protected void onPostExecute(Integer progress) {
mInfo.setDownloadState(DownloadInfo.DownloadState.COMPLETE);
}
@Override
protected void onPreExecute() {
mInfo.setDownloadState(DownloadInfo.DownloadState.DOWNLOADING);
}
}
这是我的调用AsyncTask的Adapter类
public class DownloadInfoArrayAdapter extends ArrayAdapter<DownloadInfo> {
public static TextView progpercent;
public static Integer result;
private static class ViewHolder {
TextView textView;
ProgressBar progressBar;
Button button;
DownloadInfo info;
TextView size;
TextView prog;
public TextView progpercent;
}
private static final String TAG = DownloadInfoArrayAdapter.class.getSimpleName();
public DownloadInfoArrayAdapter(Context context, int textViewResourceId,
List<DownloadInfo> objects) {
super(context, textViewResourceId, objects);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View row = convertView;
final DownloadInfo info = getItem(position);
ViewHolder holder = null;
if(null == row) {
LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.file_download_row, parent, false);
holder = new ViewHolder();
holder.textView = (TextView) row.findViewById(R.id.downloadFileName);
holder.progressBar = (ProgressBar) row.findViewById(R.id.downloadProgressBar);
holder.size=(TextView) row.findViewById(R.id.downloadFileSize);
holder.progpercent=(TextView) row.findViewById(R.id.downloadFileProgress);
row.setTag(holder);
} else {
holder = (ViewHolder) row.getTag();
}
holder.textView.setText(info.getFilename());
holder.progressBar.setProgress(info.getProgress());
holder.progressBar.setMax(100);
holder.size.setText(info.getFileSize());
info.setProgressBar(holder.progressBar);
info.setDownloadState(DownloadInfo.DownloadState.QUEUED);
FileDownloadTask task = new FileDownloadTask(info);
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
return row;
}
}
这是我的列表活动
public class DownloadInfo
{
private final static String TAG = DownloadInfo.class.getSimpleName();
public enum DownloadState {
NOT_STARTED,
QUEUED,
DOWNLOADING,
COMPLETE
}
private volatile DownloadState mDownloadState = DownloadState.NOT_STARTED;
private String mFilename;
private String mFileSize;
private String mFileUrl="";
private volatile Integer mProgress;
private volatile ProgressBar mProgressBar;
private Integer mFilePercent;
private String mFileType;
private Integer mSize;
public DownloadInfo(String filename, String FileUrl, String size, String type) {
mFilename = filename;
mProgress = 0;
mFileUrl = FileUrl;
mFilePercent=0;
mSize = 0;
mFileType= type;
mFileSize = size;
mProgressBar = null;
}
public ProgressBar getProgressBar() {
return mProgressBar;
}
public void setProgressBar(ProgressBar progressBar) {
Log.d(TAG, "setProgressBar " + mFilename + " to " + progressBar);
mProgressBar = progressBar;
}
public void setDownloadState(DownloadState state) {
mDownloadState = state;
}
public DownloadState getDownloadState() {
return mDownloadState;
}
public Integer getProgress() {
return mProgress;
}
public void setProgress(Integer progress) {
this.mProgress = progress;
}
public String getFileType() {
return mFileType;
}
public void setFileType(String FileType) {
mFileType = FileType;
}
public Integer getSize() {
return mSize;
}
public void setSize(Integer FSize) {
mSize = FSize;
}
public String getFileSize() {
return mFileSize;
}
public void setFileSize(String FileSize) {
mFileSize = FileSize;
}
public Integer getFilePercent() {
return mFilePercent;
}
public void setFilePercent(Integer FilePercent) {
mFilePercent = FilePercent;
}
public String getFilename() {
return mFilename;
}
public String getFileUrl()
{
return mFileUrl;
}
}
请帮助!
答案 0 :(得分:2)
在适配器类中设置:
info.setDownloadState(DownloadInfo.DownloadState.QUEUED);
这意味着在下一个getView调用中,即使之前已经下载了因为重置状态,也会运行该文件的下载。
您可以检查适配器中的状态,而不是AsyncTask。