Glide, Recyclerview, Volley, медленный отклик и загрузка изображения - PullRequest
0 голосов
/ 05 декабря 2018

Я не могу понять, почему мои изображения загружаются вечно.У меня есть встроенная нумерация страниц с recyclerView, я использовал библиотеку glide для решения проблем с кеш-памятью, использовал библиотеку залпов и рассчитал свои ответы , но все еще не могу понять, почему дела идут медленно.

У меня в настоящее время естьAndroid-приложение, которое связывается с моим REST API , используя volley , для получения информации из моего AWS RDS в JSON формате.Информация JSON состоит из URL-адреса изображения для каждого объекта.Я использую glide для загрузки URL-адреса изображения в recyclerview .

Изображения загружаются очень медленно, и я не могу понять, почему.Я использовал System.currentTimeMillis (), чтобы вычислять время (мс), необходимое для вычисления каждого шага процесса.

Время, рассчитанное для различных методов:

Время метода onBindViewHolder: <10 мс </strong>

public void onBindViewHolder(@NonNull SetViewHolder holder, final int position) {

    Glide.clear(holder.ivProduct);

    long startTime = System.currentTimeMillis();

    DecimalFormat df = new DecimalFormat("##.#");
    holder.tvPrice.setText("$"+items.get(position).getPrice());
    holder.tvDistance.setText(df.format(items.get(position).getDistance())+" Km");
    holder.tvProductA.setText(items.get(position).getName());
    Glide.with(activity).load("https://s3.us-east-2.amazonaws.com/apptrial-userfiles-mobilehub-748145725/" + items.get(position).getImageURL())
            .fitCenter()
            .placeholder(R.drawable.placeholder)
            .error(android.R.drawable.stat_notify_error)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .into(holder.ivProduct);
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (onTapListener != null){
                onTapListener.onTapView(position);
            }

        }
    });

    Log.i("STATUSCHECK", "bindView time: " + (System.currentTimeMillis() - startTime));
}

Приведенный выше код возвращает время <10 мс </strong>, что по этой ссылке redditхитрости по оценке скорости , является подходящим и приемлемым ответом.

Среднее время запроса залпа: 700 мс

StringRequest sr = new StringRequest(Request.Method.POST, "http://xxxx.xxx.xxxx/xxxx.php", new Response.Listener<String>() {

        long startTime = System.currentTimeMillis();

        @Override
        public void onResponse(String response) {
            Log.i("VOLLEY RESPONSE ALL", response);
            Log.i("STATUSCHECK", "right after receving volley response");
            volleyResponse = response;
            //code before when working without string response

            try{

                GsonBuilder builder = new GsonBuilder();
                final Gson gson = builder.create();
                final JSONArray array = new JSONArray(response);
                Log.i("VOLLEYTOARRAY", array.toString());
                final List<Product> itemList = new ArrayList<>();

                for(int i=0;i<array.length();i++){
                    Product item = gson.fromJson(array.getString(i), Product.class);
                    itemList.add(item);
                }

                final StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
                adapter = new AllPandSAdapter(getActivity(), itemList);
                adapter.setOnTapListener(new OnTapListener() {
                    @Override
                    public void onTapView(int position) {

                        //pass info to detailed post
                        try {
                            Intent i = new Intent(getContext(), StandardDetailedPost.class);
                            Product chosenProduct = gson.fromJson(array.getString(position), Product.class);
                            i.putExtra("product", chosenProduct);
                            i.putExtra("TABLE", "allpands");
                            startActivity(i);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });
                recyclerView.setHasFixedSize(true);
                recyclerView.setItemViewCacheSize(20);
                recyclerView.setDrawingCacheEnabled(true);
                recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
                recyclerView.setLayoutManager(manager);
                recyclerView.setAdapter(adapter);
                recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                    @Override
                    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                        super.onScrolled(recyclerView, dx, dy);

                        int[] lastVisibleItemPositions = manager.findLastVisibleItemPositions(null);
                        int lastVisibleItem = getLastVisibleItem(lastVisibleItemPositions);
                        int totalItemCount = manager.getItemCount();
                        if (!isLoading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                            isLoading = true;
                        }
                    }
                });
                pbLoad.setVisibility(View.GONE);


                Log.i("STATUSCHECK", "volleyResponse time: " + (System.currentTimeMillis() - startTime));

            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            if(error!=null){
                Toast.makeText(getActivity(), "Volley Response Error: " + error, Toast.LENGTH_SHORT).show();
            }

        }
    }){
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put("category","AllPandS");
            params.put("latitude",lat+"");
            params.put("longitude",lon+"");
            return params;
        }
    };
    sr.setRetryPolicy(new RetryPolicy() {
        @Override
        public int getCurrentTimeout() {
            return 50000;
        }

        @Override
        public int getCurrentRetryCount() {
            return 50000;
        }

        @Override
        public void retry(VolleyError error) throws VolleyError {

        }
    });

Приведенный выше код возвращает ответ временив среднем 700 мс , что, согласно этому сообщению, время отклика на вызов покоя , намного меньше времени отклика, которое было дано во время его тестов.

Таким образом, согласно другим проверенным временам ответа, мой onBindView отвечает хорошо, мои запросы залпа отвечают хорошо, и я использую скольжение для загрузки изображений (который обрабатывает весь кэш памяти) ... почему мои изображения по-прежнему занимают до 30секунд для загрузки?

Cнекоторые проливают некоторый свет на то, что я делаю неправильно, или на что я упускаю ...

Примечание: размеры файла изображения варьируются от 6 КБ до200 кб.Итак, я знаю, что размеры файлов не замедляют загрузку изображения.

Могут ли это быть серверы, на которых я размещаю хостинг?Мой REST API размещен на хостингере, а мои изображения загружены в AWS RDS

...