【发布时间】:2019-09-04 11:08:10
【问题描述】:
我正在开发一个安卓应用程序。在我的活动中,我有一个 RecyclerView 和 recyclerview 有数百个项目,主要是图像和视频(但我只显示视频缩略图而不是加载视频)。
在 recyclerview 适配器中,我重写了 onViewRecycled 方法并使用 glide clear 方法和其他本地方法清除所有图像:
Glide.with(holder.itemView.getContext()).clear(holder.postimage);
holder.postimage.setImageDrawable(null);
holder.postimage.setImageBitmap(null);
但是当我加载数百个项目时内存增加并且应用程序首先冻结(系统显示“应用程序没有响应”消息)然后它抛出 OutOfMemory 错误。
我想知道“这是否因为 recyclerview 而发生”然后我决定打开相同的活动来查看内存是否会自行清理。
这是我的代码:
startActivity(new Intent(MainActivity.this,MainActivity.class));
finish();
Runtime.getRuntime().gc();
即使我终止了我之前的活动并在 Android Profiler 上调用垃圾收集器内存使用率也不会降低,并且应用程序会引发 oom 错误。 我还清除了所有列表,将所有引用设置为 null 并将所有侦听器设置为 null ondestroy 方法,但垃圾收集器不做任何事情?
我该如何解决这个问题?
编辑这是我的主页
我所有的变量都是全局的:
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 数据检索过程是异步任务
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) {
}
});
【问题讨论】:
-
不可读的代码
-
@m0skit0oh 感谢您注意到我会修复
-
@m0skit0 你现在可以看了吗?
标签: android memory android-activity memory-management out-of-memory