如何在ProgressListener中使用AWS TransferManager更新Android UI?
我正在使用AWS TransferManager将文件下载到SD卡。它允许ProgressListener,但我无法更新视图,因为它位于不同的线程上。我该怎么做 下面的btn.setText()方法会生成此警告,并且不会更新UI: android.view.ViewRootImpl$CalledFromErrorThreadException:只有 创建视图层次结构的原始线程可以接触其视图如何在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.
使用在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!!!");
}
}
});
}
}