Android 当更新来自后台线程时,如何处理进度条状态

Android 当更新来自后台线程时,如何处理进度条状态,android,Android,这是一个简单的场景: 您可以在一个单独的线程中启动一些后台操作,比如说,网络操作 将ProgressBar设置为可见 在网络操作完成之前离开你的应用程序 当你的应用程序在后台时,网络操作将完成,但你永远不会收到回调(或触发事件),因为你应该取消订阅回调/事件订阅,以防止意外的异常(你只能从主线程修改UI视图) 尽管您的后台操作已经完成,您仍可以继续应用程序并在屏幕上看到ProgressBar 我很好奇处理这种情况的最佳方法是什么。我的答案是服务或意向服务。当你的应用程序在后台时,我假设你隐藏了进

这是一个简单的场景:

  • 您可以在一个单独的线程中启动一些后台操作,比如说,网络操作
  • ProgressBar
    设置为可见
  • 在网络操作完成之前离开你的应用程序
  • 当你的应用程序在后台时,网络操作将完成,但你永远不会收到回调(或触发事件),因为你应该取消订阅回调/事件订阅,以防止意外的异常(你只能从主线程修改UI视图)
  • 尽管您的后台操作已经完成,您仍可以继续应用程序并在屏幕上看到
    ProgressBar

  • 我很好奇处理这种情况的最佳方法是什么。

    我的答案是
    服务
    意向服务
    。当你的应用程序在后台时,我假设你隐藏了进度条。当应用程序位于前台时,您可以绑定到服务实例,可能有一个返回当前进度的方法。如果进度大于或等于最大值,则再次显示进度,否则执行另一个操作

    一个可能的选项也可以使用事件总线(例如)以及在网络操作完成后举行粘性事件,并在活动的恢复中检查此事件。

    此类场景(还可以包括数据处理、视图更新等)的一般模式为:


    这样,每次活动或片段出现在前台时,视图都会用最新的参数进行更新。

    ProgressBar是否在XML中?
    /*
      `controller` is the object with reference to the task
      currently being executed.
      It can be anything:
          a network operation, 
          a file copy, 
          an image processing, 
          an asset loading, etc, etc...
    */
    
    public void onStart() {
       super.onStart();
       myView.setSomeProperty(controller.getCurrentValue());
       controller.subscribe(this);
    }
    
    public void onStop() {
       controller.unsubscribe(this);
       super.onStop();
    }
    
    @Override
    public void onControllerSubscriptionUpdate(int newValue){
       myView.setSomeProperty(newValue);
    }