1

我收到附加代码的以下错误。这里的问题是即使在退出“for”循环之后线程仍在运行。我所做的只是单击一个按钮,我将一堆文件上传到云端。ListofDocs[]是我存储要上传的文件列表的位置。任何帮助表示赞赏。TIA。

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();
            }
        });
      }
4

2 回答 2

1

为了使代码能够编译,i必须是实例变量,而不是局部变量。这意味着ListofDocs[i]它将引用该实例变量的值......在线程主体实际执行的时间点。很有可能是在外循环i增加到ListofDocs.length. 因此数组索引超出范围。

您不应该使用实例变量。相反,您应该使用final局部变量;例如

for(int i=0; i < ListofDocs.length; i++) {
    final int final_i = i;
    ...
        // in the anonymous inner class
        uploadFile(ListofDocs[final_i]);
}
于 2013-11-03T16:17:59.800 回答
0

我已将循环从线程外部更改为线程内部。由于线程只执行一次,所以我的代码只执行一次并且递增数组元素。现在的代码工作正常。

于 2013-11-08T19:11:16.540 回答