2013-04-20 23 views
0

我正在使用AWS TransferManager将文件下载到SD卡。它允许一个ProgressListener,但我不能更新视图,因为它在不同的线程上。我怎样才能做到这一点?如何在ProgressListener中使用AWS TransferManager更新Android UI?

的btn.setText()以下方法产生这样的警告并不会更新UI:

android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次的 原来的线程可以触摸它观点。

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!!!"); 
       } 
      } 
     }); 

    } 

} 

回答

0

使用是在UI线程创建的,所以它会收到呼叫handleMessageRunnable.run()对线程Handler对象。

0

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

  • 尝试Activity.runOnUiThread(Runnable接口),View.post(Runnable接口),View.postDelayed(Runnable接口,长)
  • 使用处理程序或的AsyncTask。这是一个example,通过AmazonS3Client.putObject将文件上传到S3并将更新发送到对话框。

你可以找到更多关于线程here的信息。希望这可以帮助。