我无法弄清楚为什么我的图像要永久加载。我已经使用了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