Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ProgressListener中使用AWS TransferManager更新Android UI?_Android_Multithreading_Amazon Web Services - Fatal编程技术网

如何在ProgressListener中使用AWS TransferManager更新Android UI?

如何在ProgressListener中使用AWS TransferManager更新Android UI?,android,multithreading,amazon-web-services,Android,Multithreading,Amazon Web Services,我正在使用AWS TransferManager将文件下载到SD卡。它允许ProgressListener,但我无法更新视图,因为它位于不同的线程上。我该怎么做 下面的btn.setText()方法会生成此警告,并且不会更新UI: android.view.ViewRootImpl$CalledFromErrorThreadException:只有 创建视图层次结构的原始线程可以接触其视图 使用在UI线程上创建的处理程序对象,这样它将在该线程上接收对handleMessage或Runnable.

我正在使用AWS TransferManager将文件下载到SD卡。它允许ProgressListener,但我无法更新视图,因为它位于不同的线程上。我该怎么做

下面的btn.setText()方法会生成此警告,并且不会更新UI:

android.view.ViewRootImpl$CalledFromErrorThreadException:只有 创建视图层次结构的原始线程可以接触其视图


使用在UI线程上创建的
处理程序
对象,这样它将在该线程上接收对
handleMessage
Runnable.run()
的调用。

有几种方法可以做到这一点

  • 尝试Activity.rununuithread(Runnable)、View.post(Runnable)、View.postDelayed(Runnable、long)
  • 使用处理程序或异步任务。下面是一个使用AmazonS3Client.putObject将文件上载到S3并将更新发送到对话框的示例
您可以找到有关线程的更多信息。希望这有帮助

public class Download
{

   ProgressDialog    dialog;
   File              new_video_file;
   Button            btn;              //the progress meter needs to know what button called this. set via setter method below.
   int               position;

   protected void start(int position, Button btn) 
   {
      this.btn            = (Button) btn;
      this.position       = position;
      this.new_video_file = new File(storage_dir, arr_videos.get(position));                   //local file to be writtent to


      AWSCredentials credentials                             = new BasicAWSCredentials("xxx", "xxx" );
      TransferManager tx                                     = new TransferManager(credentials);

      Log.v("s3_bucket", s3_bucket); 
      Log.v("s3_dir", s3_dir); 
      Log.v("name", arr_videos.get(position)); 

      final com.amazonaws.services.s3.transfer.Download download   = tx.download(s3_bucket, s3_dir + arr_videos.get(position), new_video_file);

      download.addProgressListener(new ProgressListener() {

          public void progressChanged(ProgressEvent pe) {
              Double progress = download.getProgress().getPercentTransfered();

              String percent = progress.intValue() + "%";

              Log.v("progress", percent);

              btn.setText(percent);

              if (download.isDone()) {
                  Log.v("dev", "download complete!!!");
              }
          }
      });

   }

}