gpt4 book ai didi

java - 下载在 ListView 中重新开始

转载 作者:行者123 更新时间:2023-12-02 03:45:57 24 4
gpt4 key购买 nike

我正在使用 AsyncTask 和 arrayList 制作一个多下载器。我希望我的 Android 应用程序在我的应用程序后台下载视频。这就是为什么我创建了一个应用程序类并在那里初始化了我的下载数组列表。我的下载 ListView 完美地添加了新项目,但是当添加新项目时,前一个项目(无论是完全下载还是部分下载)都会开始再次下载。

这是我的应用程序类:

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 Activity 和 ArrayAdapeter Activity :

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

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;
}



}

这是我的 Activity 列表

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;
}
}

请帮忙!

最佳答案

在您设置的适配器类中:

info.setDownloadState(DownloadInfo.DownloadState.QUEUED);

这意味着在下一次 getView 调用时,即使之前已下载过该文件,您也将运行该文件的下载,因为您重置了状态。

您可以检查适配器中的状态,而不是 AsyncTask 中的状态。

关于java - 下载在 ListView 中重新开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36292888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com