从服务器检索数据太慢

Posted

技术标签:

【中文标题】从服务器检索数据太慢【英文标题】:Data retrive from server too slow 【发布时间】:2019-04-03 09:35:32 【问题描述】:

我正在获取有关启动画面的数据。我从服务器获取了近 7k 数据。从服务器获取数据时,我将其保存在本地数据库中,但问题是过程太慢。几乎需要5分钟。我想解决问题。请帮忙。

从服务器获取数据并将其保存到数据库中的代码:

                    private void productsDetailsApi() 

    String tag_json_obj = "json_obj_req";
    String url = Constants.PRODUCTS_DETAILS_URL;

    pBar.setVisibility(View.VISIBLE);


    JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
            url, new JSONObject(),
            new Response.Listener<JSONObject>() 

                @Override
                public void onResponse(JSONObject response) 

                    Log.e("product_response", response.toString());

                    try 

                        JSONArray jsonArray = response.getJSONArray("data");
                        for (int i = 0; i < jsonArray.length(); i++) 

                            JSONObject jsonObject = jsonArray.getJSONObject(i);
                            JSONObject company = jsonObject.getJSONObject("company");

                            ModelProductDetail modelProductDetail = new ModelProductDetail();
                            modelProductDetail.setCompany_id(jsonObject.getString("company_id"));
                            modelProductDetail.setProduct_name_nl(jsonObject.getString("name_nl"));
                            modelProductDetail.setProduct_name_fr(jsonObject.getString("name_fr"));
                            modelProductDetail.setProduct_desc(jsonObject.getString("description"));
                            modelProductDetail.setProduct_id(jsonObject.getString("id"));
                            modelProductDetail.setEan_code(jsonObject.getString("ean_code").trim());
                            modelProductDetail.setArticle_code(jsonObject.getString("article_code").trim());
                            modelProductDetail.setProduct_mbh(jsonObject.getString("mbh"));
                            modelProductDetail.setProduct_msrp(jsonObject.getString("msrp"));
                            modelProductDetail.setProduct_source(jsonObject.getString("source"));
                            modelProductDetail.setCompany_name(company.getString("name"));
                            modelProductDetail.setFranco_trading_value("");
                            modelProductDetail.setFranco_product_value(company.getString("franco_amount_product"));

                            dbHelper.addProductsDetails(modelProductDetail);
                        

                        dbHelper.close();

                        ArrayList<ModelProductDetail> modelProductCodeList = dbHelper.getProductsArticleCode();
                        Log.e("TAG", "ModelProductDetail:art " + modelProductCodeList.size());


                        shopDetailsApi();


                     catch (Exception e) 
                        e.printStackTrace();
                    

                    //pBar.setVisibility(View.GONE);
                
            , new Response.ErrorListener() 

        @Override
        public void onErrorResponse(VolleyError error) 
            VolleyLog.e("Error: " + error.getMessage());
            // pBar.setVisibility(View.GONE);
        
    );


    jsonObjReq.setRetryPolicy(new DefaultRetryPolicy(
            100000,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));


    AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);

数据库插入查询

           //add products data
public void addProductsDetails(ModelProductDetail modelProductDetail) 
    SQLiteDatabase productsDb = this.getWritableDatabase();
    ContentValues values = new ContentValues();

    values.put(KEY_PRODUCT_ID, modelProductDetail.getProduct_id());
    values.put(KEY_PRODUCT_NAME_FR, modelProductDetail.getProduct_name_fr());
    values.put(KEY_PRODUCT_NAME_NL, modelProductDetail.getProduct_name_nl());
    values.put(KEY_PRODUCT_DESC, modelProductDetail.getProduct_desc());
    values.put(KEY_PRODUCT_ART, modelProductDetail.getArticle_code());
    values.put(KEY_PRODUCT_EAN, modelProductDetail.getEan_code());
    values.put(KEY_PRODUCT_MBH, modelProductDetail.getProduct_mbh());
    values.put(KEY_PRODUCT_MSRP, modelProductDetail.getProduct_msrp());
    values.put(KEY_PRODUCT_SOURCE, modelProductDetail.getProduct_source());
    values.put(KEY_COMPANY_ID, modelProductDetail.getCompany_id());
    values.put(KEY_COMPANY_NAME, modelProductDetail.getCompany_name());
    values.put(KEY_FRANCO_TRADING, modelProductDetail.getFranco_trading_value());
    values.put(KEY_FRANCO_PRODUCT, modelProductDetail.getFranco_product_value());
    productsDb.insert(TABLE_PRODUCT_DETAILS, null, values);
    productsDb.close();

【问题讨论】:

【参考方案1】:

您可以尝试将所有插入包装在事务中,例如:-

                    JSONArray jsonArray = response.getJSONArray("data");
                    dbHelper.getWritableDatabase.beginTransaction(); //<<<<<<<<<< ADDED
                    for (int i = 0; i < jsonArray.length(); i++) 

                        JSONObject jsonObject = jsonArray.getJSONObject(i);
                        JSONObject company = jsonObject.getJSONObject("company");

                        ModelProductDetail modelProductDetail = new ModelProductDetail();
                        modelProductDetail.setCompany_id(jsonObject.getString("company_id"));
                        modelProductDetail.setProduct_name_nl(jsonObject.getString("name_nl"));
                        modelProductDetail.setProduct_name_fr(jsonObject.getString("name_fr"));
                        modelProductDetail.setProduct_desc(jsonObject.getString("description"));
                        modelProductDetail.setProduct_id(jsonObject.getString("id"));
                        modelProductDetail.setEan_code(jsonObject.getString("ean_code").trim());
                        modelProductDetail.setArticle_code(jsonObject.getString("article_code").trim());
                        modelProductDetail.setProduct_mbh(jsonObject.getString("mbh"));
                        modelProductDetail.setProduct_msrp(jsonObject.getString("msrp"));
                        modelProductDetail.setProduct_source(jsonObject.getString("source"));
                        modelProductDetail.setCompany_name(company.getString("name"));
                        modelProductDetail.setFranco_trading_value("");
                        modelProductDetail.setFranco_product_value(company.getString("franco_amount_product"));

                        dbHelper.addProductsDetails(modelProductDetail);
                    

                    dbHelper.getWritableDatabase.setTransactionSuccessful(); //<<<<<<<<<< ADDED
                    dbHelper.getWritableDatabase.endTransaction(); //<<<<<<<<<< ADDED
                    dbHelper.close();

要使用上述内容,您还必须删除该行

    productsDb.close();

来自插入查询

【讨论】:

大约需要 27 秒。我们可以让它更快吗@MikeT

以上是关于从服务器检索数据太慢的主要内容,如果未能解决你的问题,请参考以下文章

Readline 太慢 - 更快吗?

JCIFS:文件检索太慢而无法使用

axios 不会从 django 服务器检索数据

从服务器检索数据花费了太多时间

使用 pyodbc 从 SQL 中检索数据

未从在线 mysql 服务器检索数据