如何以通用方式在Android上实现异步操作的“加载视图”?

时间:2016-02-07 17:48:37

标签: android user-interface design-patterns asynchronous event-bus

每个对用户请求执行一些后台工作的应用程序都必须以某种方式表明它很忙 - 通常会显示一些动画“加载视图”。

如何以通用方式实现此行为? “通用”我的意思是:

  1. 应用程序的每个屏幕都没有复制粘贴的xml / java代码(一些带有动态布局修改的基本活动/片段类?)
  2. 没有用于在具体活动/片段类中显示/隐藏“加载视图”的代码(在启动/完成异步操作时发布事件?)
  3. 换句话说,实现一些具体的屏幕,我不必考虑加载视图。

    有人实施过类似的东西吗?

    编辑:更具体的例子

    假设我有一个屏幕A,B和C,在一个Activity中实现为Fragments。每个屏幕必须在显示标准视图之前异步加载一些数据,我们是否必须显示微调器才能获取数据。

    我想在一些BaseFragment中实现这个功能,所以在FragmentA,FragmentB,FragmentC中,我不必考虑它 - 我只是调用异步操作,加载会自动显示。相应的布局a.xml,b.xml,c.xml也不应包含任何其他视图。

2 个答案:

答案 0 :(得分:1)

您可以定义一个用于加载的通用片段,只要您在后台执行任务就会调用该片段,并在任务结束后进行替换。

如果您正在设计平板电脑的布局,有时在同一个活动中包含两个片段,您可以使用其标签或ID知道要替换哪个片段。假设其中一个片段的id是firstFragment,然后当单击其中的组件来触发加载过程时,可以将firstFragment替换为加载片段。

如果您将使用AsyncTask类执行任务,则可以更新onProgressUpdate方法中的进度条。

以下是一些有用的链接:

http://developer.android.com/intl/es/reference/android/widget/ProgressBar.html#setProgress%28int%29

http://developer.android.com/intl/es/reference/android/os/AsyncTask.html

http://developer.android.com/intl/es/training/basics/fragments/fragment-ui.html

我希望这会有所帮助。

答案 1 :(得分:0)

我发布了我迄今为止开发的解决方案。但是,我希望有一些更简单/更聪明的方法。

我有一个抽象的BaseFragment类,它包含(在onCreatView()中)由具有手动膨胀布局的具体片段创建的视图:

<FrameLayout>
  <LoadingView/>
  <ConcreteFragmentView/>
</FrameLayout>

每个异步操作都在CommandExecutor类上执行:

public class CommandExecutor{

  void execute(Runnable callback){
    //  1. post event "loading started"
    //  2. execute callback on background thread
    //  3. post event "loading completed"
    //  4. post results
  }
}

使用事件总线发布事件(我使用Greenrobot&#39;)。

基本片段侦听加载已开始/已完成事件并显示/隐藏加载视图。

优点:

  • BaseFragment的子类不必了解有关进度指标的任何信息
  • 进度指标在单片段范围内,因此多片段屏幕没有问题

缺点:

  • 在动画期间加载结束时看起来不太好看
  • 更深层次,手动布局通胀
  • 强制继承