java - 如何在 OnDestroy 中删除此 firebase 侦听器以减少内存泄漏?
问题描述
这是我的产品展示功能。当我从另一个活动访问此活动时,另一个活动可能由于内存泄漏而被破坏。我该如何解决这个问题?如何关闭听众?我想销毁这是 OnDestroy 方法,因为它可能会导致内存泄漏,而且我已经读到这样做是一个好习惯。
private void getProductDetails(String productID) {
DatabaseReference productsRef = FirebaseDatabase.getInstance().getReference().child("Products");
productsRef.child(productID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NotNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
Products products = dataSnapshot.getValue(Products.class);
productName.setText(products.getPname());
productPrice.setText(products.getPrice());
if (products.getInStock().equals("Yes")){
inStock.setText("In Stock");
inStock.setTextColor(ContextCompat.getColor(ProductDetailsActivity.this,R.color.primary));
}else {
inStock.setText("Not In Stock");
inStock.setTextColor(ContextCompat.getColor(ProductDetailsActivity.this,R.color.red));
addToCartBtn.setEnabled(false);
}
ifFreeDelivery = "No";
DatabaseReference mref;
final String[] phone = new String[1];
mref = FirebaseDatabase.getInstance().getReference("Values").child("deliveryCharge");
mref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
phone[0] = dataSnapshot.getValue(String.class);
deliveryCharge = Integer.parseInt(phone[0]);
//do what you want with the likes
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Products productsImg = dataSnapshot.getValue(Products.class);
ArrayList<String> test = productsImg.getImage();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference myRef = rootRef.child("Products").child(products.getPid()).child("image");
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
//this will be called for every child in your list
test.add(s);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
//this will be called for every child changed in your list
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
ArrayList<SlideModel> images = new ArrayList<>();
for(int i = 0; i < test.size() ; i++) {
images.add(new SlideModel(test.get(i),null));
}
productImage.setImageList(images);
productImgDownloadBtn.setOnClickListener(v -> {
for(int i = 0; i < products.getPicCount() ; i++) {
String url = test.get(i).replace(" ","");
DownloadImage(url);
}
});
productDescription.setText(products.getDescription());
productDetailsCopyBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Product description",products.getDescription());
clipboard.setPrimaryClip(clip);
Toast.makeText(ProductDetailsActivity.this, "Product description copied..", Toast.LENGTH_SHORT).show();
}
});
//Picasso.get().load(products.getImage().get(0)).into(productImage);
}
}
@Override
public void onCancelled(@NonNull @NotNull DatabaseError databaseError) {
}
});
}
解决方案
正如我在您的代码中看到的,您在第一部分中使用addValueEventListener()
,这意味着您正在侦听实时更新。应该根据您的活动的生命周期删除这种侦听器。另请注意,onDestroy 并不总是被调用。
但是,在使用时addListenerForSingleValueEvent()
,不需要移除任何监听器,因为它只读取一次数据。
推荐阅读
- javascript - icremeant 不能正常工作,调用另一个数组,里面有另一个值
- google-cast - CAF 接收器是否支持 Live DAI?
- sql - 如何从 SQL Server 存储过程执行 SSIS 包并传递参数
- json - 解析 JSON 数据以填充 TableView
- python - 我可以弄清楚为什么但是相似度(lk)超出了应有的程度,有人可以帮我解决吗?
- javascript - 在 Firebase 中将电话号码设置为主键并防止重复
- python-3.x - 为什么我的功能在没有任何变化的情况下停止工作?
- sql - 如何查询上周每天的库存数量
- android - Flutter 上的 Image_Picker 构建失败(任务“:app:transformClassesWithMultidexlistForDebug”的执行失败。)
- javafx - 如何在 JavaFX 微调器中设置小数位?