2014-03-10 5 views
1

У меня есть несколько файлов в учетной записи Dropbox. Я успешно загружаю файлы. Но я хочу показать индикатор выполнения с процентом, поэтому, когда все файлы будут загружены. Индикатор выполнения заканчивается. Я использую AsyncTask для загрузки файлов. Вот мой код.Android - Загрузка файла по обновлению Progress Bar

public void onPreExecute(){ 

     mDialog = new ProgressDialog(mContext); 
     mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     mDialog.setMax(100); 
     mDialog.show(); 
    } 

    public void downloadFiles(String filename){ 
     Log.i("Item Name",filename); 
     File dir = null; 
     Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 


     if(isSDPresent){ 

     File sdCard = Environment.getExternalStorageDirectory(); 
     dir = new File (sdCard.getAbsolutePath() + "/AllSecure"); 
     if (!dir.exists()) { 
      dir.mkdirs(); 
     } 
     }else{ 

      dir = mContext.getDir("users", Context.MODE_PRIVATE); //Creating an internal dir; 
      if(!dir.exists()) 
      { 
       dir.mkdirs(); 
      }  

     } 

     File file = new File(dir, filename); 
     try { 
      FileOutputStream mFileOutputStream=new FileOutputStream(file); 

      DropboxFileInfo mDropboxFileInxfo=mApi.getFile(PHOTO_DIR + filename, null, mFileOutputStream, null); 

      } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } catch (DropboxException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 
    } 


    protected String doInBackground(String... params) { 

     SessionUtil ses = new SessionUtil(mContext); 
      AndroidAuthSession session = ses.buildSession(); 
      mApi = new DropboxAPI<AndroidAuthSession>(session); 


     Entry entries = null; 

     try { 
      System.out.println("mApi is " + mApi); 
      entries = mApi.metadata(PHOTO_DIR, 10000, null, true, null); 
     } catch (DropboxException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

     for (Entry e : entries.contents) { 
      if (!e.isDeleted) { 
       //Log.i("Is Folder",String.valueOf(e.isDir)); 
       downloadFiles(e.fileName()); 
       mFileLen = entries.bytes; 
       Log.i("Item Name",e.fileName()); 
      } 
     } 



     return null; 
    } 

    protected void onProgressUpdate(Integer... progress) { 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     mDialog.dismiss(); 



    } 

ответ

0

Вы должны вызвать метод publishProgress в doInBackground. Вы должны передать свой прогресс в качестве аргумента для метода publishProgress.

Например:

protected String doInBackground(String... params) { 

     SessionUtil ses = new SessionUtil(mContext); 
      AndroidAuthSession session = ses.buildSession(); 
      mApi = new DropboxAPI<AndroidAuthSession>(session); 


     Entry entries = null; 

     try { 
      System.out.println("mApi is " + mApi); 
      entries = mApi.metadata(PHOTO_DIR, 10000, null, true, null); 
     } catch (DropboxException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

     int max = entries.contents.size(); // 2 variables need to calculate progress 
     int current = 0; 

     for (Entry e : entries.contents) { 
      if (!e.isDeleted) { 
       //Log.i("Is Folder",String.valueOf(e.isDir)); 
       downloadFiles(e.fileName()); 
       mFileLen = entries.bytes; 
       Log.i("Item Name",e.fileName()); 

       current++; //calculate your progress 
       publishProgress(100 * current/max); //then pass it 
      } 
     } 



     return null; 
    } 

После publishProgress называется onProgressUpdate будет вызван.

вам нужно обрабатывать обновления прогресса как этот

protected void onProgressUpdate(Integer... progress) { 
    Integer p = progress[0]; 
    mDialog.setProgress(p); 
    mDialog.setMessage(String.format("%d%%", p)); //if you need to see progress percentage in dialog's text 
} 
+0

благодарю вас за ваш ответ, но не работает. не показывая процентное увеличение при загрузке. – hellosheikh

+0

вы можете вызвать метод setMessage диалогового окна прогресса, чтобы установить прогресс/Что-то вроде mDialog.setMessage (String.format ("% d %%", p)); Он покажет процент прогресса в тексте диалога –

+0

где? в функции onProgressUpdate? – hellosheikh

2

Существует так много образцов для этого. Пожалуйста, проверьте это tutorial

enter image description here

+0

@RP вот что я м говорить в о. +1 up –

+0

Было бы неплохо, если бы вы приняли этот ответ, Рад, что это вам помогло. –

0

Вы можете использовать индикатор выполнения для этого. Код может выглядеть следующим образом:

private ProgressBar mProgressBar; 
public void onPreExecute(){ 
    mProgressBar.setVisibility(ProgressBar.VISIBLE); 
    } 

    public void downloadFiles(String filename){ 
     Log.i("Item Name",filename); 
     File dir = null; 
     Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 


     if(isSDPresent){ 

     File sdCard = Environment.getExternalStorageDirectory(); 
     dir = new File (sdCard.getAbsolutePath() + "/AllSecure"); 
     if (!dir.exists()) { 
      dir.mkdirs(); 
     } 
     }else{ 

      dir = mContext.getDir("users", Context.MODE_PRIVATE); //Creating an internal dir; 
      if(!dir.exists()) 
      { 
       dir.mkdirs(); 
      }  

     } 

     File file = new File(dir, filename); 
     try { 
      FileOutputStream mFileOutputStream=new FileOutputStream(file); 

      DropboxFileInfo mDropboxFileInxfo=mApi.getFile(PHOTO_DIR + filename, null, mFileOutputStream, null); 

      } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } catch (DropboxException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 
    } 


    protected String doInBackground(String... params) { 

     SessionUtil ses = new SessionUtil(mContext); 
      AndroidAuthSession session = ses.buildSession(); 
      mApi = new DropboxAPI<AndroidAuthSession>(session); 


     Entry entries = null; 

     try { 
      System.out.println("mApi is " + mApi); 
      entries = mApi.metadata(PHOTO_DIR, 10000, null, true, null); 
     } catch (DropboxException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     int size = entries.contents.size(); 
     int i = 0 ; 
     for (Entry e : entries.contents) { 
      if (!e.isDeleted) { 
       //Log.i("Is Folder",String.valueOf(e.isDir)); 
       downloadFiles(e.fileName()); 
       mFileLen = entries.bytes; 
       Log.i("Item Name",e.fileName()); 
      } 
      publishProgress(i * 100/size); 
      i++; 

     } 



     return null; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     mProgressBar.setProgress(values[0]); 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     mProgressBar.setVisibility(ProgressBar.INVISIBLE); 



    } 
4

Существует полезный абстрактный класс в Dropbox API называется ProgressListener, я использовал его как этот

DBApi.getFile(dropPath, null, outputStream, new ProgressListener(){ 
        @Override 
        public long progressInterval() { 
         return 500; 
        } 
        @Override 
        public void onProgress(long arg0, long arg1) { 
         int totalSize=(int) arg1; 
         int downloadedSize=(int) arg0; 
         //Here you can interact with progressbar 
        } 
       }); 
+0

Простейшее решение, и выглядит как лучшее из всего, что видел ive – Ben

+0

Откуда у arg0 и arg1? Я пытаюсь сделать индикатор выполнения для загрузки, но я не знаю, как определить размер файла, чтобы рассчитать прогресс. – Josephus

+0

Это часть API Dropbox, взгляните на документы https://www.dropboxstatic.com/static/developers/dropbox-android-sdk-1.6.3-docs/ – greenfrvr