android, считывает содержимое 100-300 файлов из папки FTP… Зависает

#android #ftp #bufferedinputstream

#Android #ftp #bufferedinputstream

Вопрос:

Я использую RetrieveFilestream метод с BufferedInputStream в цикле for. Я закрываю все потоки после обработки каждого файла, а также добавляю ожидающую завершения команду ftp.

В моей тестовой среде все работает так, как ожидалось, с несколькими файлами. Но в данных реального времени, где есть 200-300 файлов, он где-то зависает.

Он не выдает никаких исключений, затрудняющих отладку. Не удается отлаживать один за другим. Любая помощь? Вот мой блок кода.

      public String LoopThroughFiles(FTPClient myftp, String DirectoryName)
                 {
                     boolean flag=false;
                     String output="";

                      InputStream inStream=null;


                      BufferedInputStream bInf= null;

                      StringBuilder mystring = new StringBuilder();
                      progressBar = (ProgressBar) findViewById(R.id.progressBar);    


                     try {
                          flag= myftp.changeWorkingDirectory(DirectoryName);

                        if(flag==true)
                        {
                         FTPFile[] files = myftp.listFiles();

                         progressBar.setMax(files.length);


                         String fname="";

                         myftp.enterLocalPassiveMode();

                        if(files.length > 0) 
                        {

                             int n=0;

                            for (FTPFile file : files)  
                            {


                                 n=n 1;
                                int r= progressBar.getProgress();
                                progressBar.setProgress(r n);


                               fname=file.getName();
                              // String path= myftp.printWorkingDirectory();

                              if(fname.indexOf("txt") != -1)
                              { 

                                inStream =  myftp.retrieveFileStream(fname);

                                int reply = myftp.getReplyCode();

                                if (inStream == null   || (!FTPReply.isPositivePreliminary(reply) amp;amp; !FTPReply.isPositiveCompletion(reply)))  {Log.e("error retrieving file",myftp.getReplyString()); }


                             bInf=new BufferedInputStream (inStream);
                              int bytesRead;
                             byte[] buffer=new byte[1024]; 
                             String fileContent=null; 


                           while((bytesRead=bInf.read(buffer))!=-1)
                           {
                               fileContent=new String(buffer,0,bytesRead);
                               mystring.append(fileContent);

                           }

                            mystring.append(",");

                             bInf.close();

                             inStream.close();

                              boolean isSucess= myftp.completePendingCommand();  
                              if(isSucess == false)
                                  Log.e("error retrieving file","Failed to retrieve the stream for "   fname);

                              }

                            }


                          flag= myftp.changeToParentDirectory(); 

                          }
                        }

                    }
                     catch (java.net.UnknownHostException e) {  
                          e.printStackTrace();  
                          Log.e("readfile,UnknownHost",e.getMessage());

                        }  
                        catch (java.io.IOException e) {  
                          e.printStackTrace();  
                          Log.e("readfile,IO",e.getMessage());
                        }  
                       catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                         Log.e("readfile,General",e.getMessage());
                       } 
                     finally
                     {
                         try {

                          output = mystring.toString();

                          if(bInf != null)
                              bInf.close();

                          if(inStream != null)
                            inStream.close();


                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                                 Log.e("readfile,finallyblock",e.getMessage());
                            }
                     }

                     return output;
                 }
  

Комментарии:

1. Почему вы не используете AsyncTask ?

2. Я запускаю эту функцию только в AsyncTask

3. Пожалуйста, опубликуйте еще немного кода.

4. Это не зависает пользовательский интерфейс. Но для обработки около 300 текстовых файлов, в каждом из которых есть только одна строка текста, требуется всего 2 минуты или больше. Просто хочу, чтобы он работал быстро. Есть ли какой-нибудь способ? Есть ли какие-либо другие Ftp-клиенты, кроме apache, которые я могу попробовать.