2017-01-10 59 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秒内不会出现屏幕渲染。 –