我有一个在后台运行的下载过程,并使用进度更新UI(ListView适配器)。它工作正常,直到我离开活动并回来。再次加载活动后,有一个“新”ListView对象与绑定到BG下载过程的对象不同。如何构建我的代码,以便后台进程可以在我的活动中始终与ListView对话?
执行此操作的具体行是:
adapter.notifyDataSetChanged();
以下是Download类的shell:
public class Download
{
}
protected void start()
{
TransferManager tx = new TransferManager(credentials);
this.download = tx.download(s3_bucket, s3_dir + arr_videos.get(position), new_video_file);
download.addProgressListener(new ProgressListener()
{
public void progressChanged(final ProgressEvent pe)
{
handler.post( new Runnable()
{
@Override
public void run()
{
if ( pe.getEventCode() == ProgressEvent.COMPLETED_EVENT_CODE )
{
Download.this.onComplete();
}
else
{
Download.this.onProgressUpdate();
}
}
});
}
});
}
protected void onProgressUpdate()
{
this.download_status = "downloading";
Double progress = this.download.getProgress().getPercentTransfered();
Integer percent = progress.intValue();
//Log.v("runnable", percent + "");
downloaded_data.edit().putInt(position+"", percent).commit();
adapter.notifyDataSetChanged();
}
}
答案 0 :(得分:0)
简短的回答只是“不”。在破坏/重新创建的Activity中找不到/保持对ListView的引用没有简单的方法。
解决这个问题的一种方法是使用BroadcastReceiver。您可以广播进度意图,并在onCreate()和onPause()中使用Activity注册/注销这些意图。
你能做到的另一个(可以说是更容易的)黑客攻击是坚持状态(跟你正在使用的download_data.edit()),并在你的Activity中有一个线程定期轮询这个状态和更新相应的ListView。
答案 1 :(得分:0)
您可以将listview的数据保存在文件中,然后在函数onCreate回调中将其保存。使用File可能是一种解决方案。一旦您的活动被销毁,所有数据都将丢失
答案 2 :(得分:0)
使任务可分离,就像放置在活动更改之间始终存在的组件中的Executor服务一样: