2015-11-29 3 views
1

Сбивание с толку результатов ... У меня есть 5 progressBars в действии, отлично работающем.Слишком много 7 потоков/стоков? Что замедляет мое приложение для сканирования?

Но через некоторое время пользовательский интерфейс почти останавливается.

Как я могу быть уверен, что мои обработчики 5 progressBar выходят на завершение после достижения progressBars MAX?

Ниже приведен пример одной из Progressbars в моей деятельности.

public void doProgressBarA() { 

    maskBar4 = (progBar) child2.findViewById(R.id.fragmentB_progressBar4); 
    new Thread(new Runnable() {//Start long running op in background thread 
     public void run() { 
      final SharedPreferences nnn =  getSharedPreferences("com.blagmyname.app", MODE_PRIVATE); 
       int spRateValue = nnn.getInt("current_name_number", 0); 
      while (m4progressStatus < spRateValue) { 
       m4progressStatus += 3; 
       // Update the progress bar and display the current value in the text view 
       mask4handler.post(new Runnable() { 
        public void run() { 
         maskBar4.setProgress(m4progressStatus); 
        } 
       }); 
       try { // Sleep for 20 ms to display the progress slowly 
        Thread.sleep(8); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }).start(); 
} 
//////////////////////////////////////////////////////////////////////////// 
+2

Возможно, слишком часто обновляется индикатор выполнения. Я думаю, вы должны использовать asynctask для этого в любом случае. http://stackoverflow.com/questions/9671546/asynctask-android-example В нем есть метод 'onProgressUpdate()' – WalterM

+0

Я использую его для анимации 5 ProgressBars в последовательности, вы действительно думаете, что это проблема? –

+0

Спасибо за указатель. Я использовал следующее, потому что это было объяснительно для новичка, подобного мне. http://android-er.blogspot.co.uk/2014/04/run-multi-asynctask-as-same-time.html –

ответ

1

Aysynctask идеально подходит для этого сценария. Но, в aysynctask, вы не сможете обновить GUI оттуда. Вы обновите графический интерфейс после завершения метода doInBackground.

Причина, по которой я говорю, aysynctask идеально подходит для этого сценария из-за метода onProgressUpdate(). Вы можете обновить свой индикатор выполнения. Чтобы использовать aysynctask, просто вызовите метод .execute() на свой объект. Затем это вызовет класс AysyncTask. Вам нужно будет сделать этот класс, и поставить по крайней мере, один из методов AysyncTask в:

enter image description here

www.willcode4food.net

Обратите внимание, метод onProgressUpdate на диаграмме. Оттуда вы можете обновить ваш прогресс бар, который не нужно даже быть обновлены, что часто:

enter image description here

xsun.info

Я настоятельно рекомендую смотреть на андроид документы и онлайн примеры aysynctask. Это не составит труда, просто скопируйте и вставьте содержимое потока в другой класс asyncTask.

Посмотрите на это:

http://developer.android.com/reference/android/os/AsyncTask.html

0

Я бросил этот пример вместе, и прокомментировал, чтобы сделать его более очевидным, что происходит.

progressBar = (ProgressBar)findViewById(R.id.progress_bar); 

    new Thread(){ 
     //10 times a second. the lower this is the more often the progress bar updates. 
     static final int UPDATE_DELAY = 1000/10; 

     static final int WHAT_UPDATE_PROGRESS = 1; 
     static final int WHAT_UPDATE_PROGRESS_STOP = -1; 

     Handler handler = new Handler(Looper.getMainLooper(), new Handler.Callback() { 
      @Override 
      public boolean handleMessage (Message msg) { 
       switch (msg.what){ 
        case WHAT_UPDATE_PROGRESS: { 
         //do update on progress bar 
         progressBar.setProgress(progress); 

         //resend message back to same handler at a delay 
         handler.sendEmptyMessageDelayed(WHAT_UPDATE_PROGRESS, UPDATE_DELAY); 
        } return true; 
        case WHAT_UPDATE_PROGRESS_STOP: { 
         //do update on progress bar for final time 
         progressBar.setProgress(progress); 
         //remove all messages from handler to do with updating 
         handler.removeMessages(WHAT_UPDATE_PROGRESS); 
         { 
          //do whatever you want here, on the main thread when finished. 
          Toast.makeText(getApplicationContext(), "Done", Toast.LENGTH_SHORT).show(); 
         } 
        } return true; 
       } 
       return false; 
      } 
     }); 

     //volatile to ensure it is the same across all threads. 
     volatile int progress = 0; 

     @Override 
     public void run(){ 
      try { 
       progressBar.setMax(1000); 
       //send first message to start updating progressbar 
       handler.sendEmptyMessage(WHAT_UPDATE_PROGRESS); 

       //this is where your logic goes. 
       for (int i = 0; i < progressBar.getMax(); i++) { 
        progress++; 
        try { 
         Thread.sleep(10); 
        } catch (Exception e) { 
         Thread.currentThread().interrupt(); 
        } 
       } 
      } finally { 
       //if finished, or something fails - make sure to stop updating progress 
       handler.sendEmptyMessage(WHAT_UPDATE_PROGRESS_STOP); 
      } 
     } 
    }.start(); 

 Смежные вопросы

  • Нет связанных вопросов^_^