0

Я использую ProgressBar со значениями для отображения во время извлечения базы данных в моем Android приложения, но в ProgressBar значения превышает 100 и отображают до 122%ProgressBar в AsyncTask показывают значений больше 100

Я попытался установить ,

if(progress<=100) 
publishProgress(progress); 

, но это приводит к показу 100% в течение длительного времени.

Может кто-нибудь, пожалуйста, помогите в расчете прогресса с реагированием на размер файла и извлечения.

Вот мой код:

@Override 
protected Integer doInBackground(Void... params) { 
    byte[] buf = new byte[8192]; 
    String name = null; 

    try { 
     System.out.println("doInBackground"); 
     listener.onDoInBackground(context,true); 
     name = "db_sqlite.7z"; 
     //InputStream of the sqlite file 
     InputStream in = context.getResources().openRawResource(R.raw.db_sqlite); 
     int fileSize = in.available(); 
     FileOutputStream out = context.openFileOutput("db.sqlite", 0);//Context.MODE_PRIVATE); 
     try { 

     /* In contrast to other classes in org.tukaani.xz, 
      LZMAInputStream doesn't do buffering internally 
      and reads one byte at a time. BufferedInputStream 
      gives a huge performance improvement here but even 
      then it's slower than the other input streams from 
      org.tukaani.xz. 
      in = new BufferedInputStream(in); */ 

      in = new XZInputStream(in); 
      int size; 
      int counter=0; 
      while ((size = in.read(buf)) != -1) { 
       //System.out.write(buf, 0, size); 
       if(this.isCancelled()) 
        break; 
       out.write(buf, 0, size); 
       counter++; 
       progress = (int) (counter*100*1024/(double)fileSize); 
       publishProgress(progress); 
      } 

    protected void onProgressUpdate(Integer... values) { 
    //System.out.println("onProgressUpdate"); 
    super.onProgressUpdate(values); 
    listener.onProgressUpdation(context, true, values); 
    } 

В деятельности:

@Override 
    public void onProgressUpdation(Context context, Boolean isStarted, Integer... values) { 
           tv_you_can_change.setText(context.getResources().getString(R.string.extracting_database) + " " + values[0] + "%"); 
    tv_you_can_change.setVisibility(View.VISIBLE); 
    progressBar.setProgress(values[0]); 
    //System.out.println("onProgressUpdation"); 
    } 
+0

проверить значение 'значения [0]' перед установкой значение для индикатора выполнения. то есть перед '.setProgress (значения [0])' – govindpatel

+0

@govindpatel: проблема связана с progress = (int) (counter * 100 * 1024/(double) fileSize); –

ответ

0

Да, я нашел способ!

//Original file size i.e size after extraction 
float fileSize = 160088064; 

HARDCODED размер файла после извлечения ...

try { 
      // In contrast to other classes in org.tukaani.xz, 
      // LZMAInputStream doesn't do buffering internally 
      // and reads one byte at a time. BufferedInputStream 
      // gives a huge performance improvement here but even 
      // then it's slower than the other input streams from 
      // org.tukaani.xz. 
      //in = new BufferedInputStream(in); 

      in = new XZInputStream(in); 
      int size; 
      int counter=0; 
      while ((size = in.read(buf)) != -1) { 
       if(this.isCancelled()) 
        break; 
       out.write(buf, 0, size); 
       counter++; 
       //System.out.println((counter*8192)/fileSize); 
       progress = (int) (((counter*bufferSize)/fileSize)*100); 
        publishProgress(progress); 
      } 

Спасибо всем помогли найти это ...

1

InputStream.available() не возвращает общее число байтов, он возвращает оценку числа байтов который можно читать без блокировки.

В этой ситуации нет действительно хорошего способа определить общий размер. Однако, поскольку это ресурс, вы знаете размер во время компиляции, и он не изменяется во время выполнения. Таким образом, просто сохраните размер в ресурсе Number (или его жесткий код, если нужно).

Для определения количества прочитанных байтов, сохраняйте общее количество номеров, возвращаемых in.read() . Тогда прогресс - это просто bytesRead/fileSize.

0

попробовать это:

@Override 
    protected Integer doInBackground(Void... params) { 
     byte[] buf = new byte[8192]; 
     String name = null; 

     try { 
      System.out.println("doInBackground"); 
      listener.onDoInBackground(context,true); 
      name = "db_sqlite.7z"; 
     //InputStream of the sqlite file 


InputStream in = context.getResources().openRawResource(R.raw.db_sqlite); 
    int fileSize = in.available(); 
    FileOutputStream out = context.openFileOutput("db.sqlite", 0);//Context.MODE_PRIVATE); 
    try { 

    /* In contrast to other classes in org.tukaani.xz, 
     LZMAInputStream doesn't do buffering internally 
     and reads one byte at a time. BufferedInputStream 
     gives a huge performance improvement here but even 
     then it's slower than the other input streams from 
     org.tukaani.xz. 
     in = new BufferedInputStream(in); */ 

     in = new XZInputStream(in); 
     int size; 
     int counter=0; 
     while ((size = in.read(buf)) != -1) { 
       //System.out.write(buf, 0, size); 


    if(this.isCancelled()) 
       break; 
      out.write(buf, 0, size); 
      counter++; 

      progress = (int) (counter/(double)fileSize*100); 
      publishProgress(progress); 
     } 

    protected void onProgressUpdate(Integer... values) { 
    //System.out.println("onProgressUpdate"); 


    super.onProgressUpdate(values); 
     listener.onProgressUpdation(context, true, values); 
     } 
+0

Пробовал таким образом, чтобы он не показывал никаких значений, 0% по-прежнему остается добычей. – Saran