2013-04-20 22 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的信息。希望這可以幫助。