2012-03-02 68 views
0

我正在使用org.apache.commons.net.ftp.FTPClient通過一個Android應用程序與一個FTP服務器進行通信我正在做記錄視頻,然後將其上傳到FTP服務器。一切都很好,直到我打電話給storeFile時,應用程序才阻止任何交互,直到上傳完成。有沒有辦法解決?我目前正在爲API lvl 12開發。 我的設置如下我有一個在後臺調用服務來處理視頻記錄以及ftp設置的類。在FTP類中,我在asynctasks中有我的任何fptclient交互。這裏是我上傳文件的方法:org.apache.commons.net.ftp.FTPClient.storeFile凍結交互和動畫

public boolean upload(String srcFilePath, String desFileName, String desDirectory) 
{ 
    if(!isLoggedIn()) 
    { 
     return false; 
    } 
    boolean status = false; 
    try 
    { 
     status = new AsyncTask<String, Void, Boolean>(){ 
      @Override 
      protected Boolean doInBackground(String... args) { 
       boolean status = false; 
       try { 
        String srcFilePath = args[0]; 
        String desFileName = args[1]; 
        String desDirectory = args[2]; 
        FileInputStream srcFileStream = new FileInputStream(srcFilePath); 

        // change working directory to the destination directory 
        if (changeDirectory(desDirectory,true)) { 
         status = mFTPClient.storeFile(desFileName, srcFileStream); 
        } 
        srcFileStream.close(); 
        return status; 
       } catch (Exception e) { 
        Log.d(TAG, "upload failed"); 
        e.printStackTrace(); 
        return false; 
       } 
      } 
     }.execute(srcFilePath, desFileName, desDirectory).get(); 
    } catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
     return status; 
    } catch (ExecutionException e) 
    { 
     e.printStackTrace(); 
     return status; 
    } 
    return status; 

} 

任何幫助將非常感激!

Devunwired的帖子工作! Hoorah!

回答

1

通過使用AsyncTask將這個長時間運行的任務放到後臺線程中,您已經開始了正確的路徑,因此它不會阻止用戶界面。但是,在執行任務後立即調用get(),您無論如何都會有效地阻止UI線程,因爲get()是一種阻止方法。從SDK文檔:

AsyncTask.get()

如有必要,等待計算完成,然後獲取其結果。

您應該做的是重構您的AsyncTask以使用onPostExecute()方法。當後臺任務完成時,這個方法將被調用,並且你的結果值作爲參數,並且將在UI線程中調用,這樣你就可以安全地更新你喜歡的任何東西。

HTH

+0

您好,先生,是一位紳士和學者。謝謝!很棒。我真的需要更多關注api文檔。衛生署!再次感謝!!! – 2012-03-05 15:57:23

+0

我很高興它的工作。如果您發現此答案有幫助,請隨時註冊並/或接受它(左側的數字指示符號和下方的選中標記)。謝謝!! – Devunwired 2012-03-05 15:59:31