后台线程如何在Android中的Activity加载之间修改UI?

时间:2013-08-08 02:55:05

标签: android multithreading listview background

我有一个在后台运行的下载过程,并使用进度更新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();
   }
}

3 个答案:

答案 0 :(得分:0)

简短的回答只是“不”。在破坏/重新创建的Activity中找不到/保持对ListView的引用没有简单的方法。

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

你能做到的另一个(可以说是更容易的)黑客攻击是坚持状态(跟你正在使用的download_data.edit()),并在你的Activity中有一个线程定期轮询这个状态和更新相应的ListView。

答案 1 :(得分:0)

您可以将listview的数据保存在文件中,然后在函数onCreate回调中将其保存。使用File可能是一种解决方案。一旦您的活动被销毁,所有数据都将丢失

答案 2 :(得分:0)

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

  1. 使用服务:客户端可以连接到它并请求正在运行的任务等。
  2. 实现Application类,让它保存对正在运行的任务的引用,通过静态字段公开。