2017-01-10 60 views
1

這裏是我的代碼:進度條不顯示,Android的

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

這是因爲您正在嘗試在UI線程上完成您的工作 - 在此方法結束之前,UI將不會實際更新。

嘗試改變您的通話這樣:

public void onClick(View view) { 

    progressBar.setVisibility(View.VISIBLE); 

    progressBar.post(new Runnable() { 

     public void run() { 

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

這將立即顯示視圖,並提交可運行 - 長時間運行的任務 - 到消息隊列;此任務將在後臺線程上運行,後臺線程仍然可以操作UI,但不會導致它掛起。

+0

謝謝了。就是這樣。 – RJB

+0

但是,爲什麼是這樣,如果代碼的第一行是設置可見性?只有在以後我才能在UI線程上工作? – RJB

+0

這裏實際的'onClick'方法在控制UI的線程中運行。直到此方法返回後,實際的渲染操作纔會發生。如果該方法需要5秒才能完成,那麼5秒內不會出現屏幕渲染。 –