代码之家  ›  专栏  ›  技术社区  ›  Thomas

如何在一定时间后显示ProgressBar

  •  0
  • Thomas  · 技术社区  · 5 年前

    我正在使用Android API级别23(Android 6)。 我正在使用com。洛普。安卓http。AsyncHttpClient实现了与后端服务器的异步通信,运行良好。

    在与服务器通信时,我显示了一个进度条 这样地:

    findViewById(R.id.loadingPanel).setVisibility(View.VISIBLE);
    

    然后像这样隐藏它:

    findViewById(R.id.loadingPanel).setVisibility(View.GONE);
    

    当作为 suggested here .

    它运行得非常好。

    现在,大多数情况下,对服务器的请求只需要几毫秒,因此显示和隐藏进度条会导致一些闪烁,如果请求时间很短,这是不必要的,也很烦人。

    在请求开始后的一段时间内,比如说一秒钟后,什么是显示进度条的好方法?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Mithun Sarker Shuvro    5 年前

    我猜你做了类似的事情

     AsyncHttpClient client = new AsyncHttpClient();
     client.get("https://www.example.com", new AsyncHttpResponseHandler() {
    
        @Override
        public void onStart() {
            // called before request is started
           findViewById(R.id.loadingPanel).setVisibility(View.VISIBLE);
        }
    
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] response) {
            // called when response HTTP status is "200 OK"
            findViewById(R.id.loadingPanel).setVisibility(View.GONE);
        }
    
        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
            // called when response HTTP status is "4XX" (eg. 401, 403, 404)
        }
    
        @Override
        public void onRetry(int retryNo) {
            // called when request is retried
        }
    });
    

    试试下面的方法

    boolean showProgress= true;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AsyncHttpClient client = new AsyncHttpClient();
        client.get("https://www.google.com", new AsyncHttpResponseHandler() {
    
            @Override
            public void onStart() {
                // called before request is started
                //findViewById(R.id.loadingPanel).setVisibility(View.VISIBLE);
    
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if(showProgress){
                            findViewById(R.id.loadingPanel).setVisibility(View.VISIBLE);
                        }
                    }
                }, 5*1000); // your progress will start after 5 seconds
            }
    
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] response) {
                // called when response HTTP status is "200 OK"
                //findViewById(R.id.loadingPanel).setVisibility(View.GONE);
                showProgress = false;
            }
    
            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
                // called when response HTTP status is "4XX" (eg. 401, 403, 404)
                showProgress = false;
            }
    
            @Override
            public void onRetry(int retryNo) {
                // called when request is retried
            }
        });
    }
    
        2
  •  0
  •   Kévin Giacomino    5 年前

    可以在显示进度条之前设置延迟,如下所示:

    Handler myHandler = new Handler();
    myHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            // Do something after 1s = 1000ms
            findViewById(R.id.loadingPanel).setVisibility(View.VISIBLE);
        }
    }, 1000);
    
        3
  •  0
  •   Arnab Banerjee    5 年前

    可以使用最初设置为true的布尔标志变量。然后,当您收到来自服务器的响应时,可以翻转标志值。然后可以使用如下处理程序:

    Handler myHandler = new Handler();
    myHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if(flag)
                findViewById(R.id.loadingPanel).setVisibility(View.VISIBLE);            
        }
    }, 1000);
    
    Handler endHandler = new Handler();
        endHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                    findViewById(R.id.loadingPanel).setVisibility(View.GONE);            
            }
        }, MAX_WAIT_TIME_YOU_WANT);
    
        4
  •  0
  •   ישו אוהב אותך Mahavir    5 年前

    你可以简单地使用 CountDownTimer 马上。这样地:

     private boolean mNeedToCloseProgress = false;
     // in second with 100 ms tick
     CountDownTimer mCdtStartProgress = new CountDownTimer(1000, 1000) {
    
         public void onTick(long millisUntilFinished) {}
    
         public void onFinish() {
            mNeedToCloseProgress = true;
            findViewById(R.id.loadingPanel).setVisibility(View.VISIBLE);
         }
      };
    

    然后,在启动api调用时,需要使用以下命令启动计时器:

    mCdtStartProgress.start();
    

    这将修改标志 mNeedToCloseProgress 这说明进展是否需要接近。

    然后,在完成调用api并通过以下操作获得结果后,取消计时器:

    mCdtStartProgress.cancel();
    if(mNeedToCloseProgress) findViewById(R.id.loadingPanel).setVisibility(View.GONE);