【问题标题】:How to make fast my android app while using json feeds from server如何在使用来自服务器的 json 提要时快速制作我的 android 应用程序
【发布时间】:2017-09-08 05:36:43
【问题描述】:

我在电子商务网站 (magento 2) 上生成了一个应用程序,而我正在尝试启动我的应用程序,由于我的服务器中有许多产品,它的处理速度非常慢是否有任何可能的方法来加快我对异步任务的使用同时使用 JSON 提要.. 请让我以任何可能的方式

我的 AsyncTask 编码之一:

private class GetProduct extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Showing progress dialog
        dialog_pro = new ProgressDialog(Healthy_Cat.this);
        dialog_pro.setMessage("Please wait...");
        dialog_pro.setCancelable(false);
        dialog_pro.show();

    }

    @Override
    protected Void doInBackground(Void... arg0) {
        HttpHandler sh = new HttpHandler();
        String jsonStr = sh.makeServiceCall(url);



        if (jsonStr != null) {
            try {


                JSONArray items = new JSONArray(jsonStr);
                for (int i = 0; i < items.length(); i++) {
                    JSONObject c = items.getJSONObject(i);
                    pro_name = c.getString("name");
                    String price = c.getString("price");
                    JSONArray array = c.getJSONArray("custom_attributes");
                    for (int k = 0; k < array.length(); k++) {
                        JSONObject jb = array.getJSONObject(k);
                        String attr = jb.getString("attribute_code");

                        if (attr.equalsIgnoreCase("special_price")) {

                            splprice = jb.getString("value");

                        }
                    }


                    String sku = c.getString("sku");

                    JSONArray media = c.getJSONArray("media_gallery_entries");

                    for(int k = 0; k < media.length(); k++) {
                        JSONObject jb = media.getJSONObject(k);

                        String imageURL =  BaseURL_Helper.MediaBase +jb.getString("file");

                        media_image = imageURL;

                        // tmp hash map for single contact
                        Beanclass dataSet = new Beanclass();
                        dataSet.setTitle(pro_name);
                        dataSet.setImage(imageURL);
                        dataSet.setPrice(price);
                        dataSet.setSPLPrice(splprice);
                        dataSet.setSku(sku);
                        list.add(dataSet);

                        BeanclassList data = new BeanclassList();
                        data.setTitle(pro_name);
                        data.setImage(imageURL);
                        data.setSku(sku);
                        data.setSPLPrice(splprice);
                        data.setPrice(price);
                        listbean.add(data);

                    }

                }
            }catch (final JSONException e) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        no_list.setVisibility(View.VISIBLE);

                    }
                });

            }
        } else {

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(),
                            "May be Network error!!",
                            Toast.LENGTH_LONG)
                            .show();
                }
            });

        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        // Dismiss the progress dialog
        /**
         * Updating parsed JSON data into ListView
         * */
        if (dialog_pro.isShowing())
            dialog_pro.dismiss();

        mAdapter = new GridviewAdapter(Healthy_Cat.this,list);
        gridlist.setAdapter(mAdapter);

        Listadapter = new ListviewAdapter(Healthy_Cat.this,listbean);
        listview_pro.setAdapter(Listadapter);

    }

}

提前谢谢你..

【问题讨论】:

  • 很难从代码中分辨出来,但是您是否尝试在listbean.add(data) 或其他地方的内部循环中加载imageURL?将加载延迟到稍后会更快地启动 UI。
  • 添加一些日志,看看主要慢在哪里,是在下载中,还是在 json 解析中,或两者兼而有之?这将有助于集中解决方案。

标签: android json magento android-asynctask


【解决方案1】:

您的代码中需要更新的内容很少

  1. API 调用库:我正在使用Retrofit 进行 api 调用,非常快速且易于使用。也支持 Header & Response 缓存。
  2. JSON 解析:您正在手动解析 JSON,这是一个耗时的过程。我正在使用 Google 的 JSON 解析库 Gson。真的非常快。
  3. 分页:如果您在服务器上有大量数据,请尝试以小片段的形式获取数据。例如,在“项目列表 API”的情况下,尝试一次从服务器获取 10-15 个项目的数据,而不是一次获取所有项目。

【讨论】:

    【解决方案2】:

    与 Retrofit 相比,Asyntask 的性能速度太低。

    所以对于电子商务应用,你必须使用 Retrofit。

    【讨论】:

    【解决方案3】:

    您可以做一些事情。对于初学者,您不必在更新视图之前解析整个 json。
    但实际上你自己陈述的问题是你有太多的数据。这不仅是编程问题,也是用户体验问题,数据过多会造成混乱,尤其是在移动设备上。
    我的建议是将您的数据分解为类别等。当应用程序启动时,只需下载要显示的类别列表。用户选择一个类别后,您就可以下载该类别的数据。
    当您下载数据时,请分块进行,以便您可以立即开始显示。
    您可以实施许多类似的想法,以获得更好的用户体验。

    【讨论】:

    • 谢谢大家
    猜你喜欢
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多