0

我有一个在后台运行的下载过程,并使用进度更新 UI(ListView 适配器)。在我离开活动并回来之前它工作正常。再次加载活动后,会出现一个“新”ListView 对象,该对象与绑定到 BG 下载过程的对象不同。如何构建我的代码,以便后台进程始终可以与我的活动中的 ListView 对话?

执行此操作的特定行是:

adapter.notifyDataSetChanged();

这是下载类的外壳:

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();
   }
}
4

3 回答 3

0

使任务可分离,就像 Executor 服务放置在组件中,在 Activity 更改之间始终存在:

  1. 使用服务:客户端可以连接到它并请求正在运行的任务等。
  2. 实现 Application 类并让它持有对正在运行的任务的引用,通过静态字段公开。
于 2013-08-08T04:10:12.087 回答
0

您可以将列表视图的数据保存在文件中,然后在函数 onCreate 回调中获取它。使用 File 可能是一个解决方案。一旦你的 Activity 被销毁,所有数据都会丢失

于 2013-08-08T04:04:44.040 回答
0

简短的回答是“不”。没有简单的方法可以在销毁/重新创建的 Activity 中查找/保留对 ListView 的引用。

解决此问题的一种方法是使用BroadcastReceiver。您可以广播进度意图,并让活动在 onCreate() 和 onPause() 中从这些意图中注册/注销。

你可以做的另一个(可以说更容易)的黑客是保持状态(沿着你正在做的下载_data.edit()),并在你的活动中有一个线程定期轮询这个状态并相应地更新ListView .

于 2013-08-08T03:17:37.723 回答