滑行,Recyclerview,Volley慢速响应和图像加载

时间:2018-12-05 00:54:23

标签: android android-volley android-glide

我无法弄清楚为什么我的图像要永久加载。我已经使用了recyclerView进行分页,使用了滑动库来解决缓存问题,使用了凌空库,并对响应时间进行了计时,但仍然无法弄清为什么进展缓慢。

我目前有一个Android应用程序,该应用程序使用 volley REST API 通信,以从 AWS RDS 中的< strong> JSON 格式。 JSON信息包含每个对象的图像URL。我正在使用 glide 将图像URL加载到 recyclerview 中。

图像加载非常缓慢,我似乎无法弄清原因。我使用System.currentTimeMillis()计算时间(毫秒)来计算过程的每个步骤。

各种方法计算的时间:

onBindViewHolder方法时间:<10ms

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 ms ,根据此链接reddit tricks on assessing speed,这是一个适当且可接受的响应。

排球平均请求时间: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毫秒,根据这篇帖子response time for rest call,该响应时间比其测试期间给出的响应时间要短。 / p>

因此,根据其他经过测试的响应时间,我的onBindView响应良好,齐射请求响应良好,并且我正在使用滑行加载图像(处理所有内存缓存)...为什么我的图像仍在拍摄最多需要30秒才能加载?

有些人可以阐明我做错了什么,或者我错过了什么...

旁注::图像文件的大小范围从6 kb到200 kb。因此,我知道文件大小不会降低图像加载的速度。

是我托管的服务器吗?我的 REST API 托管在托管器上,而我的图像则上传到 AWS RDS

0 个答案:

没有答案