Ich mache einen Multi-Downloader mit AsyncTask und ArrayList.Ich möchte meine Android-Anwendung Videos im Hintergrund meiner App herunterladen. Deshalb habe ich eine Anwendungsklasse erstellt und dort meine Download-Arraylist initialisiert. Meine Download-Listenansicht fügt neue Elemente perfekt hinzu, aber wenn ein neues Element hinzugefügt wird, wird das vorherige Element, ob es vollständig heruntergeladen oder teilweise heruntergeladen wurde, erneut heruntergeladen.Download Wiederbeginn in Listview
Hier ist meine Anwendungsklasse:
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;
}
}
Hier ist meine Klasse, wo Listenansicht bevölkert wird immer:
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));
}
}
Hier sind meine AsyncTask Aktivität und ArrayAdapeter Aktivität:
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);
}
}
Hier ist meine Adapter-Klasse, von der AsyncTask
aufgerufen wirdpublic 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;
}
}
Hier ist meine Liste Aktivität
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;
}
}
Bitte um Hilfe!
ok. Ich habe das vom Adapter "info.setDownloadState (DownloadInfo.DownloadState.QUEUED)" entfernt; und ich hinzugefügt, um diese Bedingung in dem Adapter „if (info.getDownloadState()! = DownloadInfo.DownloadState.COMPLETE || info.getDownloadState()! = DownloadInfo.DownloadState.DOWNLOADING) { info.setDownloadState (DownloadInfo .DownloadState.QUEUED); FileDownloadTask Aufgabe = new FileDownloadTask (info); task.executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR); }“ Das gleiche geschieht –
Ok, ich schrieb dies in meinem ArrayAdapter und es funktioniert jetzt .. "if (info.getDownloadState()! = DownloadInfo.DownloadState.COMPLETE && info.g etDownloadState()! = DownloadInfo.DownloadState.DOWNLOADING) {info.setDownloadState (DownloadInfo.DownloadState.QUEUED); FileDownloadTask task = new FileDownloadTask (info); task.executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR); } " Vielen Dank –