【问题标题】:Retreiving data from MySQL database using Android Volley library is too slow使用 Android Volley 库从 MySQL 数据库中检索数据太慢
【发布时间】:2017-01-16 15:00:12
【问题描述】:

我尝试在我的 Android 应用程序中检索存储在数据库中的表单数据列表。数据库的每一行都包含一些字符串格式的人的个人信息以及该人的图像。我已将图像以 MEDIUMBLOB 格式存储在数据库中。

每当我尝试在我的 Android 应用程序中使用 Volley Library 的 JSONObjectrequest 从我的服务器检索数据时,响应通常很慢。有时仅查看从数据库中检索到的 10 到 12 行就需要超过 1 分钟。 这是我的日志:

D/Volley: [337] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://helpclick.ahsanaasim.me/v1/tasksall/johny 0xa3e020c1 NORMAL 1> [lifetime=14740],

我试图寻找一个完美的解决方案,但我找不到任何令人满意的东西。这是我的 Java 代码:

        mRequestStartTime = System.currentTimeMillis();
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,
                showUrl2, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                long totalRequestTime = System.currentTimeMillis() - mRequestStartTime;
                System.out.println(totalRequestTime);
                System.out.println(response.toString());
                try { c1++;

                    System.out.println(c1);
                    JSONArray incidents = response.getJSONArray("incidents");
                    for (int i = 0; i < incidents.length(); i++) {
                        e=0;
                        JSONObject incident = incidents.getJSONObject(i);
                        c1++;
                        id= incident.getString("id");
                        age = incident.getString("age");

                        gender = incident.getString("gender");
                        location = incident.getString("location");
                        //det= incident.getString("det");

                        String image=new String();
                        image = incident.getString("bigimage");

                        if(image.length()!=0) {
                            myBitmap = ConvertToImage(image);
                            Bitmap bitmap= Bitmap.createScaledBitmap(myBitmap,500,500,true);

                            imgs.add(bitmap);
                            ages.add(age);
                            genders.add(gender);
                            locations.add(location);
                            ids.add(id);
                        }
                    }
                    if(c1>0) {
                        System.out.println(ages.size());
                        Intent intent1 = new Intent(search_buttons_page.this, All_Incidents.class);
                        startActivity(intent1);
                    }
                }
                catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                System.out.append(error.getMessage());

            }
        });
        jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(
                20000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        requestQueue.add(jsonObjectRequest);

如果有人能告诉我性能缓慢的原因以及如何通过对我的源代码进行最少的修改来解决它,那将非常有帮助。

【问题讨论】:

  • 数据库中 blob 的范围和平均大小是多少?如果您也从笔记本电脑/台式机获取端点,获取端点是否会变慢?

标签: android mysql json android-volley


【解决方案1】:

不要将图像保存在数据库中。将它们保存在文件中,并将文件的 URL 保存在数据库中。根据需要通过 URL 单独下载图像。这样您就不会因为应该是文件 IO 而浪费您的数据库访问时间。

【讨论】:

  • 感谢您的建议。我需要澄清一下。大多数专家建议使用文件系统将图像存储在数据库中。但是,据我所知,当数据库中有数千行时会出现这种情况。现在,我的数据库只包含 20-30 行数据。即使要解析的数据量如此之少,为什么该过程会如此显着减慢?
  • 即使 20-30 也太多了,尤其是考虑到您的 Android 实现。您将 20-30 存储在内存位图图像中。你会很快去 OOM 这样做。在服务器端——你还没有发布你的服务器代码。可能你还有其他问题。但是两次发送 20-30 张图像(从数据库到 Web 服务,从 Web 服务到客户端)所需的时间可能很长。
猜你喜欢
  • 1970-01-01
  • 2017-08-27
  • 2013-03-24
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
相关资源
最近更新 更多