【问题标题】:How to show ProgressBar after a certain amount of time如何在一定时间后显示 ProgressBar
【发布时间】:2019-03-14 16:40:10
【问题描述】:

我正在使用 Android API 级别 23 (Android 6)。 我正在使用 com.loopj.android.http.AsyncHttpClient 来实现与我的后端服务器的异步通信,它工作正常。

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

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

并像这样隐藏它:

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

当以suggested here 完成时。

它工作得非常好。

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

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

【问题讨论】:

  • 你在使用`compile 'com.loopj.android:android-async-http:1.4.9'`这个吗?
  • 是的,确切地说是implementation 'com.loopj.android:android-async-http:1.4.9',为什么?

标签: android android-progressbar android-threading


【解决方案1】:

我猜你做了类似以下的事情

 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
        }
    });
}

【讨论】:

  • 我只想指出,我在处理程序的public void onFinish() {方法中设置了showProgress = false;,对我来说似乎更安全。
  • 这样更好,正如你所说的更安全
【解决方案2】:

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

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】:

您可以使用最初设置为 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】:

    您只需在第二个刻度中使用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();
    

    这将修改标志mNeedToCloseProgresswhich 告诉是否需要关闭进度。

    然后在您调用完 api 并获得结果后取消计时器:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多