【问题标题】:What should I use to preload data using Volley on Android?我应该使用什么来使用 Android 上的 Volley 预加载数据?
【发布时间】:2017-07-18 19:19:30
【问题描述】:

我有一些数据存储在数据库中。在这种情况下,应用程序的用户。

我想检索他们的所有信息并放在我的应用程序的布局中,因此我需要在我的布局类的 onCreate 函数中检索数据,以便在您更改为该布局时显示在其上。

我知道 AsyncTaskVolley 对我的 API 执行异步请求,但这使得大多数时候不是整个用户都将显示在布局上,因为在呈现布局时尚未检索到他们.

我也进行了搜索,似乎有一些方法(有时似乎是变通方法)可以使 AsyncTaskVolley 同步,但它们会阻塞 UIThread。

我知道asynchronoussynchronous 请求的区别以及为什么第二个请求会阻止应用程序,所以我有一些问题。

  • 是否总是建议使用异步请求?
  • 如果同步请求不正确,在需要在呈现布局的同时显示从数据库中检索的数据的情况下使用什么?
  • 如果我希望这些数据在整个布局类中可用,我该如何处理?我需要在渲染布局时在屏幕上显示数据,但我也想用它做一些东西,所以如果我尝试在 Volley 请求的onResponse 方法之外的任何地方使用它,我总是得到null。作为数据的“预加载”。

提前致谢!

【问题讨论】:

  • 您无需延迟渲染布局,直到加载数据。您可以设置布局,显示 ProgressDialog 或类似的内容,直到异步请求完成,然后填充您的布局。
  • @nicobatu 如果我想使用这些数据在相同的布局中使用它,我应该使用全局变量吗?我的意思是,访问已检索到的数据,例如在同一布局上的按钮的 onClick 函数中。
  • API 请求完成回调应该调用一些方法来更新你的 UI。它可以将数据作为参数传递。
  • @nicobatu 那么我应该在检索到数据后重新加载布局吗?
  • 您可以在数据仍在检索/更新时显示加载对话框。

标签: android asynchronous android-asynctask android-volley synchronous


【解决方案1】:

最后,我注意到我的问题是关于概念的,因为我认为您将无法使用从 Volley 请求的 onResponse 方法检索出的数据。

最后我所做的是在我的 Fragment 上创建一个全局变量,并在完全检索到该变量时将数据分配给该变量。假设我有一个要检索的字符串。

然后我创建全局变量(在 Fragment 的顶部):

String string = "";

我创建了一个函数,将参数分配给这个全局变量:

public void setString(String string){
    this.string = string;
}

最后,在我检索到字符串后,我在 onResponse 方法上调用该函数:

StringRequest jsonArrayRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        try {
           //Do stuff to retrieve the String
           setString(response); //Assign the string "response" to the global variable via the method.
        } catch (JSONException e) {
              e.printStackTrace();
        }
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
         Log.e("LOG", error.toString());
    }
});

如果你需要对这些数据做一些事情,你应该等到数据被完全检索到,这样你就可以同时显示一个对话框。

我不知道是否有更好的方法来做到这一点,或者这是否是一种不好的做法,但这是我自己能找到的最简单的方法。

【讨论】:

    【解决方案2】:

    是否总是推荐使用异步请求?

    这不仅是推荐的,而且本质上是唯一的请求方式,因为 Android 不允许您在 UI 线程上发出请求。

    除非您另有说明,否则一切都在主 ui 线程上运行。因此,当您向服务器发出请求时,除非您将其放在另一个线程上,否则它将引发异常。

    如果同步请求不好,在您需要从数据库中检索的数据将在呈现布局的同时显示的情况下使用什么

    大多数情况下,第一次支付加载数据并在页面加载时对其进行缓存的成本是个好主意,这样您就不必在以后继续进行此调用。请记住,一次加载所有用户的数据也不是一个好主意,因为这对于大量数据是不可扩展的。您可能希望对这些数据进行分页,以便它一次加载,例如,25 条数据,缓存它,当您需要下一页时,您可以去获取它。

    您可能会遇到一些人提到 runOnUiThread 方法,这些方法本质上是在 UI 线程上运行您想要的代码。我不建议您这样做,尤其是当您加载您可能希望执行的大小的数据时。

    因此,为了给您一个起点,请对以下主题进行一些研究。

    1. 缓存(本地存储,即Realm
    2. 处理分页(分页article
    3. 尽量避免使用异步任务,它们很难处理,而且比它们的价值更令人头疼。查看retrofit
    4. 了解 Android 框架的工作原理以及同步和异步范式之间的区别。

    【讨论】:

    • 如果我同时需要所有数据该怎么办?例如,我还需要对所有用户的所有分数进行平均,我希望这个值会出现在主页中。我喜欢对其余用户进行分页的想法,但我还想在加载布局时在主页上显示一般值。
    • @Error404 您可以在布局上放置一个指示器,例如进度对话框,向用户显示您正在等待该数据块出现。它将阻止 UI,直到该数据可见。现在,如果您正在谈论实时数据,即实时更新值,那么这是一项单独的任务,我可以向您推荐如何做到这一点。
    • 我很抱歉,但也许我们在谈论同样的事情,我没有很好地解释自己。我需要在布局上显示一些值,并且它们将是静态的。另一个值将被静态存储,但我必须将它们用于不同的目的。例如,假设我预加载了所有用户的所有标记(我的布局的onCreate 函数),但我想用它们进行一些计算并显示在屏幕上或操作这些标记。我遇到的问题是我总是能很好地得到空值我尝试用这些标记进行一些计算,因为它们是异步的。
    • 例如,如果我按下一个按钮,标记会被截断,那么我是否还应该在 Volley 请求的 onResponse 上添加 onclick 处理程序?
    • 获得这些新值后,您是否在适配器上调用 notifydatasetchanged?
    【解决方案3】:

    请尝试使用 PreLoader:https://github.com/luckybilly/PreLoader

    在 Activity 启动之前使用 Volley 预加载数据,并在 UI 初始化后在 Activity.onCreate() 使用 preLoaderId 检索数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 2020-02-16
      • 1970-01-01
      • 2012-06-19
      • 2011-12-12
      相关资源
      最近更新 更多