在 Android 上使用 Volley 预加载数据应该使用什么?

What should I use to preload data using Volley on Android?

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

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

我知道 AsyncTaskVolley 对我的 API 进行异步请求,但这使得大多数时候不会在布局上显示整个用户,因为他们没有被在呈现布局时检索。

我也搜索过,似乎有一些方法(有时似乎是解决方法)使 AsyncTaskVolley 同步,但它们会阻塞 UIThread。

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

提前致谢!

Is it always recommended to use asynchronous requests?

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

一切 运行 都在主 ui 线程上,除非您另有说明。所以当你向服务器发出请求时,除非你把它放在另一个线程上,否则它会抛出异常。

If synchronous requests are bad, what is used in those cases in which you need that the data that you retrieve from your database will be displayed at the same time the layout is rendered

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

您可能 运行 某些人提到 运行OnUiThread 方法,这些方法本质上是 运行 您想要在 UI 线程上的代码。我不建议你这样做,尤其是当你正在加载你可能想要做的大数据时。

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

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

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

最后我所做的是在我的 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());
    }
});

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

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

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

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