2016-06-16 6 views
0

Я пытаюсь добавить progressBar в свою деятельность. В макете XML-файла я установил android: visibility = "gone" для progressBar и textView, который показывает уровень прогресса. Я бы хотел нажать кнопку и начать процесс с progressBar и visview = "visible", а затем скрыть их после завершения процесса.Видимость изменения зрения не работает хорошо программно

Это код моей кнопки. enter image description here

Проблема в том, что когда я нажимаю кнопку открытия, ничего не отображается !!! Когда я удаляю две строки перед Log.e («visibilty», «GONE»), представления становятся видимыми только после завершения процесса. Кажется, что инструкции setVisibility выполняются после While Loop, который настолько странный.

enter image description here

Все ребята решения?

+0

Пожалуйста, не размещайте свой код в форме изображения. Всегда копируйте его в сам вопрос. Если вы беспокоитесь о том, что ваш код отформатирован, посмотрите правила Markdown от StackOverflow [здесь] (https://stackoverflow.com/help/formatting). – computerfreaker

ответ

0

Вы пытаетесь изменить пользовательский интерфейс с задержками в основном потоке пользовательского интерфейса. Это не сработает, как ожидалось. Вы можете использовать AsyncTask для этого, который обновит представление и спрячет его в конце.

private class Sample extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     //Do in background, NO UI HERE 
     for (int i = 0; i < 100; i++) { 
      try { 
       Thread.sleep(1000); 
       this.publishProgress(); //Call onProgressUpdate 
      } catch (InterruptedException e) { 
       Thread.interrupted(); 
      } 
     } 
     return "Finished!"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     //After it's completed, touch UI here 
    } 

    @Override 
    protected void onPreExecute() { 
     //Before it starts, touch UI here 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     //Update text here, touch UI here 
    } 
} 
+1

Я бы не зашел так далеко. Обработчику должны быть все потребности OP. –

+0

согласен, что его конкретный случай может быть немного переборным –

+0

Спасибо. он работает довольно хорошо, я сделал это так: discover.setOnClickListener (новый View.OnClickListener() { @Override общественного недействительный OnClick (View v) { Пример задача = новый образец(); task.onPreExecute() ; task.doInBackground(); } }); Но он не обрабатывает метод onPostExecute(). Вследствие этого индикатор выполнения и textView остаются видимыми после завершения процесса. Любая подсказка, чтобы исправить эту проблему? – libhu

0

Если вы хотите запустить код после задержки, вы можете использовать обработчик + Runnable вместо того, чтобы спать основной поток.

final Handler handler = new Handler(); 
Runnable hideRunnable = new Runnable() { 
    @Override 
    public void run() { 
    // Your visibility logic 
    } 
}; 
handler.postDelayed(hideRunnable, 190); // 190 milliseconds 

Существует некоторая дискуссия о Updating a ProgressBar with a Handler. Если вам нужно отслеживание прогресса, у AsyncTask есть встроенный.

+0

Спасибо! Я уже пробовал это решение, но после небольшого времени процесса он вызывает у меня роковую ошибку: android.view.ViewRootImpl $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может коснуться его представлений. – libhu

+0

Именно поэтому я отказался от решения обработчика/Runnable и переключился на основной поток с помощью классической инструкции While loop и thread.sleep. – libhu

+0

О, тогда вам понадобилось дополнительное 'runOnUiThread' внутри Runnable. В любом случае, определенно не спите основной поток. –