Я работаю над приложением для Android. В моей деятельности у меня есть RecyclerView, а у recyclerview есть сотни элементов, в основном изображения и видео (но я показываю только миниатюру видео, а не загрузку видео).
В адаптере переработчика я переопределил метод onViewRecycled и удалил все изображения с помощью метода скольжения и других встроенных методов:
Glide.with(holder.itemView.getContext()).clear(holder.postimage);
holder.postimage.setImageDrawable(null);
holder.postimage.setImageBitmap(null);
Но когда я загружаю сотни элементов, память увеличивается и приложение сначала зависает (система показывает сообщение «приложение не отвечает»), а затем выдает ошибку OutOfMemory.
Я подумал: «Это происходит из-за повторного просмотра?» Затем я решил открыть ту же операцию, чтобы посмотреть, очистится ли память сама.
это мой код:
startActivity(new Intent(MainActivity.this,MainActivity.class));
finish();
Runtime.getRuntime().gc();
Даже если я убью свою предыдущую активность и вызову использование памяти сборщиком мусора на Android Profiler, оно не уменьшится, и приложение выдаст ошибку oom.
Я также очищаю все списки, устанавливаю все ссылки на null и устанавливаю все слушатели равными null в методе ondestroy, но сборщик мусора ничего не делает?
Как я могу решить это?
Изображение Android Profiler:
Изменить это моя домашняя страница
Все мои переменные являются глобальными:
Spinner spinner;
List<BasePost> list;
DatabaseReference reference;
FloatingActionButton fab;
SwipeRefreshLayout swipeRefreshLayout;
RecyclerView recyclerView;
private int yüklenen;
private boolean postson=false;
private LinearLayoutManager linearLayoutManager;
NRAdapter adapter;
private boolean loading=true;
И вот как я обычно настраиваю свою домашнюю страницу (я не добавляю весь код, только базовую структуру)
loading=true;
spinner.setEnabled(false);
swipeRefreshLayout.setRefreshing(true);
yüklenen=0;
postson=false;
linearLayoutManager=null;
adapter=null;
list=null;
reference=FirebaseDatabase.getInstance().getReference().child("posts").child(FirebaseAuth.getInstance().getUid());
linearLayoutManager = new LinearLayoutManager(getContext());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
list=new ArrayList<>();
adapter = new NRAdapter();
adapter.setHasStableIds(true);
recyclerView.setAdapter(adapter);
reference.limitToFirst(1).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
List<String> lo = new ArrayList<>();
for(DataSnapshot ds:dataSnapshot.getChildren()){
lo.add(ds.getKey());
}
if(lo.size()==0){
adapter.setContext(getContext(),list,"",reference);
list.add(new BasePost(null,null,"boş"));
adapter.notifyDataSetChanged();
postson=true;
swipeRefreshLayout.setRefreshing(false);
spinner.setEnabled(true);
}
else{
FirebaseDatabase.getInstance().getReference().child("admobadunitid").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
String admobadunitid=dataSnapshot.getValue().toString();
adapter.setContext(getContext(),list,admobadunitid,reference);
loaddata();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
И вот как я загружаю свои данные. Я загружаю данные из интернета и использую firease в качестве базы данных. И, насколько я знаю, процесс извлечения данных из Firebase - asynctask
yüklenen=0;
int eski= list.size();
List<String> gecicilist=new ArrayList<>();
List<BasePost> gecicilistbase=new ArrayList<>();
reference.limitToLast(20).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot ds:dataSnapshot.getChildren()){
gecicilist.add(ds.getKey());
}
Collections.reverse(gecicilist);
for(int i=gecicilist.size();i>0;i--){
if(içerikkontrol(list,gecicilist.get(i-1))){
gecicilist.remove(i-1);
}
}
if(gecicilist.size()>0){
for(int i=0;i<gecicilist.size();i++){
int finalI = i;
FirebaseDatabase.getInstance().getReference().child("postall").child(gecicilist.get(i)).child("info").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
BasePost basePost = new BasePost();
basePost.setPost(dataSnapshot.getValue(Post.class));
FirebaseDatabase.getInstance().getReference().child("users").child(basePost.getPost().getUid()).child("about").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
basePost.setUser(dataSnapshot.getValue(User.class));
basePost.setKey(gecicilist.get(finalI));
yüklenen++;
gecicilistbase.add(basePost);
if(yüklenen==gecicilist.size()){
yüklenen=0;
for(int i=0;i<gecicilist.size();i++){
if(list.size()!=0&&list.size()%6==0){
i--;
list.add(new BasePost(null,null,"reklam"));
}
else{
for(int m=0;m<gecicilistbase.size();m++){
if(gecicilistbase.get(m).getKey().equals(gecicilist.get(i))){
list.add(gecicilistbase.get(m));
}
}
}
}
gecicilist.clear();
if(gecicilistbase.size()==0){
postson=true;
}
gecicilistbase.clear();
if(list.size()==0){
list.add(new BasePost(null,null,"boş"));
postson=true;
}
swipeRefreshLayout.setRefreshing(false);
adapter.notifyDataSetChanged();
spinner.setEnabled(true);
loading=false;
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
else{
reference.child(gecicilist.get(finalI)).removeValue();
yüklenen++;
if(yüklenen==gecicilist.size()){
yüklenen=0;
for(int i=0;i<gecicilist.size();i++){
if(list.size()!=0&&list.size()%6==0){
i--;
list.add(new BasePost(null,null,"reklam"));
}
else{
for(int m=0;m<gecicilistbase.size();m++){
if(gecicilistbase.get(m).getKey().equals(gecicilist.get(i))){
list.add(gecicilistbase.get(m));
}
}
}
}
gecicilist.clear();
if(gecicilistbase.size()==0){
postson=true;
}
gecicilistbase.clear();
if(list.size()==0){
list.add(new BasePost(null,null,"boş"));
postson=true;
}
swipeRefreshLayout.setRefreshing(false);
adapter.notifyDataSetChanged();
spinner.setEnabled(true);
loading=false;
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});