Как избавиться от зависания приложения при многопоточности?
Кратко о проблеме: получаю из ВК список подписчиков, асинхронно запускаю получение их аватарок по url. Сам список, конечно же, прогружается быстрее аватарок и помещается в RecycleView. Аватарки в это время продолжают грузиться асинхронно.
В чём суть проблемы: когда я хочу перейти в другой фрагмент, приложение зависает, пока там фоново не прогрузятся все авы. Можно ли как-то отрубить все лишние потоки? Или лучше, чтобы они подгружались, но я мог при этом гулять по фрагментам.
Немного кода для ясности:
RecyclerView recycleViewUsersGroup = v.findViewById(R.id.recycleViewUsersGroup);
recycleViewUsersGroup.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayout.VERTICAL, false));
arrayListIDs = new ArrayList<>();
int[] counterLoadParticipants = {0};
AdapterParticipants.AdapterParticipantsCallback listener = this;
final AdapterParticipants adapterParticipants = new AdapterParticipants(getContext(), arrayListParticipants, listener);
recycleViewUsersGroup.setAdapter(adapterParticipants);
new Thread(){
@Override
public void run() {
try {
synchronized (this) {
wait(500);
do {
new VKRequest("groups.getMembers", VKParameters.from(
VKApiConst.ACCESS_TOKEN, access_token,
VKApiConst.GROUP_ID, id_check,
VKApiConst.SORT, "time_desc",
VKApiConst.OFFSET, OFFSET,
VKApiConst.FIELDS, "first_name,photo_100"))
.executeSyncWithListener(new VKRequest.VKRequestListener() {
@Override
public void onComplete(VKResponse response) {
super.onComplete(response);
try {
JSONObject obj = new JSONObject(response.json.toString());
JSONObject jsonRootObject = new JSONObject(obj.getString("response"));
JSONArray jsonArray = jsonRootObject.getJSONArray("items");
count_participants = jsonRootObject.getString("count");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject tmp_obj = jsonArray.getJSONObject(i);
arrayListIDs.add(jsonArray.getJSONObject(i).getString("id"));
int finalI = i;
new Thread() {
@Override
public void run() {
try {
synchronized (this) {
try {
System.out.println(finalI);
Bitmap mIcon11 = BitmapFactory.decodeStream((InputStream) new URL(tmp_obj.getString("photo_100")).getContent());
arrayListParticipants.add(new participant_item(
mIcon11,
tmp_obj.getString("first_name") + " " + tmp_obj.getString("last_name"),
jsonArray.getJSONObject(finalI).getString("id")));
}
catch (Exception e) { e.printStackTrace(); }
Objects.requireNonNull(getActivity()).runOnUiThread(adapterParticipants::notifyDataSetChanged);
}
}
catch (Exception e) { e.printStackTrace(); }
}
}.start();
counterLoadParticipants[0]++;
}
}
catch (Exception e){ e.printStackTrace(); }
}
@Override
public void onError(VKError error) {
Toast.makeText(getContext(), getString(R.string.Error),
Toast.LENGTH_SHORT).show();
}
});
OFFSET += 1000;
} while (OFFSET < Integer.parseInt(count_participants));
Objects.requireNonNull(getActivity()).runOnUiThread(() -> {
adapterParticipants.notifyDataSetChanged();
});
}
} catch (Exception e) { e.printStackTrace(); }
}
}.start();