2015-06-25 69 views
-5

我正在學習有關Java和Android中的Loops,但我已經碰到了一堵牆。For Loop返回循環中的最後一個值

我的代碼:

//01 
for (String FilesToDownload : Download) 
    { 
     myFILEposter = FilesToDownload; 
     fileP(); 
    } 


//02  
private void fileP() { 
// TODO Auto-generated method stub 

System.out.println("Downloading Poster: " +myFILEposter);   
new DownloadFileFromURL2().execute(file_url2 +myFILEposter); 

}    


//03 
class DownloadFileFromURL2 extends AsyncTask<String, String, String> { 
    ... 

@Override 
protected String doInBackground(String... f_url) { 

    System.out.println("Downloading Poster: " +myFILEposter); 

    ... 

請注意,我有兩個打印出來,一個在// 02,另一個在03 //應打印相同的輸出,它工作在// 02,但不// 03。這是它打印輸出:

//02 

file1 
file2 
file3 

//03 

file3 
file3 
file3 

在doInBackground輸出走的是最後一個值的循環,因此下載的最後一個文件的3倍。

+5

您的doInbackground正在使用'myfileposter'作爲輸出,而不是作爲參數傳遞給該方法......所以它從該函數的OUTSIDE中拉取該變量。 doinbackground是一個異步任務,所以在它啓動的時候,你的循環已經完成,並且你最終使用myfileposter中的最後一個值。 –

+0

但是doinbackground是從for循環中調用3次不同的值,無論如何,任何想法我怎麼能夠完成我所需要的? – user3560827

+0

但函數不會在您調用它的確切時刻運行 - 它是異步執行的。因爲你沒有傳遞你想要處理的值,所以函數到達「外部」來獲得該值。它在執行時間執行,而不是調用時間。 –

回答

0

此代碼相當可怕,沒有冒犯性。首先,變量是小寫字母而類名字是大寫字母。其次,方法可以帶參數。指定一個全局變量來訪問函數是簡單的愚蠢。但是,然後你將這個錯誤傳播到你的AsyncTask,這就是爲什麼整個事情都失敗了。清理這個爛攤子,你會得到的東西沿着線:

// oh, please-oh-please, change Download to filesToDownload 
for(String aFile : Download) { 
    downloadFile(aFile); 
} 

private void downloadFile(String whichFile) { 
    System.out.println("Downloading Poster: " + whichFile); 
    new DownloadFileFromURL2().execute(file_url2 + whichFile); 
}    


class DownloadFileFromURL2 extends AsyncTask<String, String, String> { 
    ... 

@Override 
protected String doInBackground(String... url) { 

    System.out.println("Downloading Poster: " + url[0]); 

    ... 

所以,首先你通過文件下載到您的downloadFile()方法作爲一個字符串。然後您將該字符串傳遞到您的AsyncTask ...然後實際使用該參數通過訪問url[0]

+0

感謝您花時間研究這個問題,url [0]在doInBackground下哪些文件爲null的情況下提取整個URL,我怎樣才能在沒有整個url的情況下獲取文件名? – user3560827

+0

好吧,不要傳入整個網址。無論你傳入'execute()'什麼都會在'url'參數中結束。 – 323go