2013-11-03 32 views
1

我得到了下面的錯誤代碼。這裏的問題是線程即使在退出「for」循環後仍在運行。我所做的只是點擊一個按鈕,我將一堆文件上傳到雲端。 ListofDocs[]是我存儲我想要上傳的文件列表的地方。任何幫助表示讚賞。 TIA。索引超出界限在android中的異常

11-03 21:23:27.793: E/AndroidRuntime(24480): FATAL EXCEPTION: Thread-11897 
11-03 21:23:27.793: E/AndroidRuntime(24480): java.lang.ArrayIndexOutOfBoundsException: length=12; index=12 
11-03 21:23:27.793: E/AndroidRuntime(24480): at com.projects.scloud.PicsList$1$1.run(PicsList.java:99) 
11-03 21:23:27.793: E/AndroidRuntime(24480): at java.lang.Thread.run(Thread.java:856) 
for(i=0; i < ListofDocs.length; i++) { 
      Log.i("Value of i: ", String.valueOf(i)); 
     MessageText.setText("Upload Documents"); 

     /************* Php script path ****************/ 
     upLoadServerUri = "http://www.androidexample.com/media/UploadToServer.php"; 
     Backup.setOnClickListener(new OnClickListener() {    
      @Override 
      public void onClick(View v) { 
       dialog = ProgressDialog.show(DocsList.this, "", "Uploading file...", true); 
       new Thread(new Runnable() { 
        public void run() { 
         runOnUiThread(new Runnable() { 
          public void run() { 
           MessageText.setText("uploading started....."); 
          } 
         });     

         uploadFile(ListofDocs[i]); 
        } 
       }).start(); 
      } 
     }); 
     } 
+2

一個線程將運行,直到它完成或取消。這是一個單獨的對象。爲什麼你希望線程在for循環結束之前完成?也就是說,你的代碼是完全錯誤的。你想做什麼? – Simon

+1

你很多次將不同的動態onclicnlistener設置爲一個控件(Button?)。這對我沒有意義。如果您的代碼正常工作,您將只能上傳列表中的最後一個文件。 – nio

+0

如果您正在做一次即忘即上的上傳(因爲它看起來像是在做),您應該使用一項服務,這樣您就不會被綁定到文件上傳時需要存在的活動 –

回答

0

我已經改變了從線程外部到線程內部的循環。由於線程只執行一次,我的代碼只執行一次,並增加了數組元素。現在的代碼工作正常。

1

爲了使代碼編譯,i必須是一個實例變量,而不是一個局部變量。這意味着ListofDocs[i]將在線程正文實際執行的時間點引用該實例變量的值。但機會是後外環增加iListofDocs.length。因此數組索引超出範圍。

您不應該使用實例變量。相反,你應該使用局部變量final;例如

for(int i=0; i < ListofDocs.length; i++) { 
    final int final_i = i; 
    ... 
     // in the anonymous inner class 
     uploadFile(ListofDocs[final_i]); 
} 
+0

我已經改變了從線程外部到線程內部的循環。由於線程只執行一次,我的代碼只執行一次,並增加了數組元素。現在的代碼工作正常。謝謝大家。 – user2945300

+0

@ user2945300 - 你不需要這樣修復它。但是,這很可能是正確的方式。產生一大堆線程並行上傳文件不是一個好主意。 –