Я не могу понять, почему мои изображения загружаются вечно.У меня есть встроенная нумерация страниц с 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