2017-01-10 2 views
1

Вот мой код:ProgressBar не показывая, андроид

automaticCountryButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 



      progressBar.setVisibility(View.VISIBLE); 

      if (ContextCompat.checkSelfPermission(HomeActivity.this, 
        Manifest.permission.ACCESS_FINE_LOCATION) 
        != PackageManager.PERMISSION_GRANTED){ 
       setUpLocationPermission(); 
       return; 

      } 

      Log.d(TAG, String.valueOf(gps.canGetLocation())); 
      Log.d(TAG, String.valueOf(gps.getLocation())); 
      Log.d(TAG, String.valueOf(gps.getLatitude())); 
      Log.d(TAG, String.valueOf(gps.getLongitude())); 

      Geocoder myLocation = new Geocoder(HomeActivity.this); 

      try 
      { 
       myList = myLocation.getFromLocation(gps.getLatitude(), gps.getLongitude(), 1); 
      } 
      catch (Exception e) 
      { 
       Log.d(TAG, "unable"); 

       e.printStackTrace(); 
      } 
      if(myList != null) { 
       try { 
        String country = myList.get(0).getCountryName(); 
        Log.d(TAG, country); 
        findCountryInArrayList(country); 

       } 
       catch (Exception e) 
       { 
        Toast.makeText(HomeActivity.this, "Didn't manage to automatically detect location.", Toast.LENGTH_SHORT).show(); 
        e.printStackTrace(); 
       } 

      } 

     } 
    }); 


} 

Я хочу, чтобы сразу же после того, как точка зрения щелкнул прогрессбар станет видимым. Тем не менее, он не становится видимым, пока весь код не будет закончен, что противоречит целям. Почему это не происходит прямо в начале щелчка? Я положил progressBar.setVisibility (View.VISIBLE) вверху, почему он выполняется только после завершения всего кода, что иногда занимает несколько секунд.

Большое спасибо.

ответ

1

Это потому, что вы пытаетесь выполнить свою работу над потоком пользовательского интерфейса. Пользовательский интерфейс фактически не будет обновляться, пока этот метод не завершится.

Попробуйте изменить свой вызов к этому:

public void onClick(View view) { 

    progressBar.setVisibility(View.VISIBLE); 

    progressBar.post(new Runnable() { 

     public void run() { 

      // long running code that has UI interactions 
     } 
    }); 
} 

Это сразу показать вид, и представить работоспособные - долго выполняющиеся задачи - к очереди сообщений; эта задача будет выполняться в фоновом потоке, который все еще может манипулировать пользовательским интерфейсом, но не приведет к зависанию.

+0

Спасибо тонну. Это точно. – RJB

+0

Но почему это так, если первая строка кода - установить видимость? Только позже я делаю работу над потоком пользовательского интерфейса? – RJB

+0

Фактический метод 'onClick' здесь запускается в потоке, который управляет пользовательским интерфейсом. Фактическое действие рендеринга не произойдет до тех пор, пока этот метод не вернется. Если для этого метода потребуется 5 секунд, для этого 5 секунд не будет рендеринга экрана. –

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