- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
这个问题在这里已经有了答案: How does Scala's apply() method magic work? (3 个回答) 9年前关闭。 假设我在 scala 中有一个 MyList 类,其
这个问题在这里已经有了答案: What is a non-capturing group in regular expressions? (18 个回答) Reference - What does
这个问题是针对嵌入式系统的! 我有以下选项来初始化一个对象: Object* o = new Object(arg); 这会将对象放入堆中并返回指向它的指针。我不喜欢在嵌入式软件中使用动态分配。 Ob
我自己搜索过,没能成功的正则表达式。 我有一个 html 文件,其中包含 [] 之间的变量我想把每一个字都写进去。 [client_name][client_company] [cl
我是 Python 新手。我不明白为什么这段代码不起作用: reOptions = re.search( "[\s+@twitter\s+(?P\w+):(?P.*?)\s+]", d
在过去 7 个月左右的时间里,我几乎一直在使用 .NET C# 进行编程。在那之前,我的大部分编程都是用 C++(从学校里学的)。在工作中,我可能需要在接下来的几个月里做一大堆 C 语言。我对 C 的
我是 RE 的新手,我正在尝试获取歌词并分离出歌词标题、和声和主唱: 下面是一些歌词的例子: [Intro] D.A. got that dope! [Chorus: Travis Scott] Ic
这可能是不可能的,但我想检查是否可以用一种简单的方式表达这样的事情: // obviously doesn't work class Foo : IFoo where T: Bar {
我们的应用程序中有“user”和“study”实体,存储在它们各自的表中。一项研究代表一种研究和已收集的数据。它们是多对多的关系,所以我们需要一个链接表:studies_users。 我们为用户分配角
将测试条件添加到 Visual Studio 2010 数据库单元测试(对于 SQL Server 2008)时,这些条件称为例如rowCountCondition1、rowCountConditio
在模拟器上,我可以从设置中卸载 SD 卡。 然后我可以将它安装到我的操作系统上,然后正常卸载它。 我一直无法弄清楚如何在模拟器上重新安装它(无需重新启动)。 提示: adb 命令 remount 是无
假设在一个分支上执行了一系列提交,但该分支尚未与主干重新同步。是否可以从提交中生成全局补丁?是否可以从一系列提交中生成“分组”补丁?如果是,如何? 最佳答案 svn diff -rXXX:YYY UR
在某些情况下,我想在我的应用程序中锁定调整大小功能,为此我尝试对属性进行数据绑定(bind),并且不允许在某些情况下更改它,但没有成功。 有没有办法这样做? 这是我不成功的尝试: XAML: Vie
当我的计算机连接多个显示器时,我可以检测它们,并根据从获取的值设置位置来向它们绘制图形 get(0, 'MonitorPositions') 但是,当我在 MATLAB 运行时断开监视器时,此属性不会
我们有一个grails应用程序,该应用程序在grails数据库中存储了各种域对象。该应用程序连接到第二个数据库,运行一些原始sql,并在表中显示结果。它基本上是一个报告服务器。 我们通过在DataSo
无法比较来自不同容器的迭代器(参见这里的示例: https://stackoverflow.com/a/4664519/225186 )(或者从技术上讲,它不需要有意义。) 这就提出了另一个问题,来自
我有以下情况: 家长 Activity : ParentActivityClass { private Intent intent; @Override public void onCreate(Bu
我经常将元素与附加功能 Hook ,例如: $('.myfav').autocomplete(); $('.myfav').datepicker(); $('.myfav').click(somefu
因此,我将 tooltipster.js 库用于工具提示,并尝试更改工具提示在不同屏幕尺寸上的默认距离。 所以这是默认的 init 的样子: $(inputTooltipTrigger).tool
我在 ARM7 嵌入式环境中工作。我使用的编译器不支持完整的 C++ 功能。它不支持的一项功能是动态类型转换。 有没有办法实现dynamic_cast<>() ? 我使用 Google 寻找代码,但到
我是一名优秀的程序员,十分优秀!