5

Tôi có một số AsyncTask với số không xác định ProgressBar thường thực thi rất nhanh, nhưng đôi khi từ từ. Đó là không mong muốn và mất tập trung để cho thanh tiến trình nhấp nháy nhanh khi không có sự chờ đợi rõ ràng.Làm cách nào để chỉ hiển thị ProgressBar sau một sự chậm trễ tối thiểu?

Có cách nào để trì hoãn hiển thị thanh tiến trình mà không cần tạo một thanh lề khác AsyncTask không?

Trả lời

3

Nhờ Code Droid, tôi đã có thể viết một lớp trừu tượng AsyncTask cho biết thanh tiến trình không xác định sau một độ trễ được chỉ định. Chỉ cần mở rộng lớp này thay vì AsyncTask và chắc chắn để gọi super() khi thích hợp:

public abstract class AsyncTaskWithDelayedIndeterminateProgress 
     <Params, Progress, Result> extends AsyncTask<Params, Progress, Result> { 
    private static final int MIN_DELAY = 250; 
    private final ProgressDialog progressDialog; 
    private final CountDownTimer countDownTimer; 

    protected AsyncTaskWithDelayedIndeterminateProgress(Activity activity) { 
     progressDialog = createProgressDialog(activity); 
     countDownTimer = createCountDownTimer(); 
    } 

    @Override protected void onPreExecute() { 
     countDownTimer.start(); 
    } 

    @Override protected void onPostExecute(Result children) { 
     countDownTimer.cancel(); 
     if(progressDialog.isShowing()) 
     progressDialog.dismiss(); 
    } 

    private ProgressDialog createProgressDialog(Activity activity) { 
     final ProgressDialog progressDialog = new ProgressDialog(activity); 
     progressDialog.setIndeterminate(true); 
     return progressDialog; 
    } 

    private CountDownTimer createCountDownTimer() { 
     return new CountDownTimer(MIN_DELAY, MIN_DELAY + 1) { 
     @Override public void onTick(long millisUntilFinished) { } 

     @Override public void onFinish() { 
      progressDialog.show(); 
     } 
     }; 
    } 
0

Tôi giả sử bạn đang gọi onProgressUpdate ít nhất một vài lần trước khi AsyncTask của bạn kết thúc. Nếu đó là trường hợp, những gì bạn có thể làm là điều này. Mỗi lần trước khi bạn gọi onProgressUpdate, hãy gọi Thread.sleep (250). Bằng cách này, Chủ đề nền của bạn sẽ tạm dừng trước khi giao tiếp với Chủ đề giao diện người dùng và cung cấp sự xuất hiện của một tác vụ đang chạy lâu hơn. Nếu không, tôi có thể cần phải xem mã của bạn hoặc nhận thêm một số thông tin.

+0

Xin lỗi, nó là một không xác định 'ProgressBar'. Tôi không muốn tạo ra một sự chậm trễ chỉ để làm cho nó xuất hiện dễ chịu hơn, tôi muốn tránh hiển thị hoàn toàn trừ khi sự chậm trễ bắt đầu vượt quá, nói, 250ms. –

+0

OK, đã nhận. Điều đó có ý nghĩa hơn với tôi bây giờ. Hoạt động nền của bạn là gì? –

+0

Tôi đã giải quyết nó theo cách khác trong trường hợp này, nhưng trong tương lai tôi muốn áp dụng điều này cho những thứ như tải xuống hoặc hoạt động chuyên sâu của CPU. Một số thiết bị hoặc kết nối mạng có thể phản hồi đủ nhanh để không đảm bảo cửa sổ bật lên "vui lòng đợi" và các thiết bị khác có thể chậm hơn. Mặc dù tôi không tin rằng chúng tôi đã không chỉ chuyển vấn đề 250 ms trước bằng cách trì hoãn hiển thị thanh tiến trình. Nếu hoạt động mất 251 ms, tất nhiên bạn vẫn sẽ nhận được blink/glitch, nhưng sau đó thêm một sự chậm trễ 100ms có thể làm cho nó trông một chút mượt mà và không có tác động hiệu suất tương đối nhiều. –

4

Có, có và được gọi là CountDownTimer và được sử dụng rất nhiều. Bạn có thể thực hiện hành động tại mỗi lần đánh dấu của bộ hẹn giờ hoặc khi hết giờ.

Các vấn đề liên quan