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

时间:2017-02-28 00:28:38

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

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

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

我知道AsyncTaskVolley对我的API执行异步请求,但是大多数时候不会在布局上显示整个用户,因为目前还没有检索到它们布局呈现。

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

我知道asynchronoussynchronous请求之间的区别以及第二个请求阻止应用程序的原因,所以我有一些问题。

  • 是否始终建议使用异步请求?
  • 如果同步请求不正确,那么在您需要从数据库中检索的数据将在呈现布局的同时显示的情况下使用了什么?
  • 如果我希望这些数据可以在整个布局类中使用,我该如何处理?我需要在渲染布局时在屏幕上显示数据,但我也想用它制作一些东西,所以如果我尝试在Volley请求的onResponse方法的任何地方使用它我总是得到{{ 1}}。作为" preload"数据。

提前致谢!

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:2)

  

是否始终建议使用异步请求?

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

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

  

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

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

你可能会遇到一些引用runOnUiThread方法的人,这些方法本质上是在UI线程上运行你想要的代码。我不建议你这样做,特别是当你加载你可能想要做的大小的数据时。

所以,为了给你一个开始的地方,研究一下以下主题。

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

答案 2 :(得分:0)

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

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