这是我的产品展示功能。当我从另一个活动访问这个活动时,另一个活动可能因为内存泄漏而被破坏。如何解决此问题?如何关闭监听器?我想销毁这是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()
时,不需要删除任何侦听器,因为它只读取数据一次。
问题内容: 一个典型的Redis聊天示例将如下所示(仅举一个这样的示例,请参见https://github.com/emrahayanoglu/Socket.io- Redis-RealTime-Chat- Example/blob/master/chatServer.js ): 但是,这里的问题是,当“断开连接”时,侦听器仍然处于连接状态。控制台将继续打印出。如果要检查的事件列表,他们仍然会发现
我读了很多关于如何避免Android内存泄漏的文章,但我仍然不太确定我是否做对了。 我的应用程序由一个活动组成 问题1:这够了吗? 让我困惑的是,你可以在网上找到一个经典的“不去”的例子(http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/): 我认为,一旦创建完成, 检索上下文,将其传递给手动创建的查看
我有两个屏幕..首先是闪屏,在这里我借助firebase.auth()检查用户是否已经存在。onAuthStateChanged侦听器。如果用户为空,它将转到另一个firebase.auth()的登录屏幕。onAuthStateChanged侦听器用于在电话验证后获取用户,如果用户之前未注册,则将用户移至UserDetails屏幕以获取更多用户信息,或者移至主屏幕..同样的检查也在闪屏上进行,以确
问题内容: 我有一个按钮,并添加了一些按钮: 我可以通过以下方式删除它们: 如果我想一次删除所有侦听器,或者没有函数引用()怎么办?有没有办法做到这一点,或者我必须一个一个地删除它们? 问题答案: 我认为最快的方法是克隆节点,这将删除所有事件侦听器: 请注意,因为这也会清除所涉及节点的所有子元素上的事件侦听器,因此,如果要保留该侦听器,则必须一次显式删除一个侦听器。
我正在SWT制作一个组件,它可以监听其他组件中的事件。但是,当该组件被释放时,它仍然注册为侦听器。我想知道当这个组件被释放时,如何自动删除这个监听器。 我的意思是: < code>myDialog同时侦听它自己的按钮和< code>anotherPage中的按钮。如果用户决定释放< code>myDialog(关闭对话框),但它仍然侦听< code>someButton,这是没有意义的。如何在处置
问题内容: 我有一个位置上给定用户的聊天室列表,而另一个位置上有给定聊天室的消息总数。我想跟踪用户所属聊天室中的一些消息。 我有以下片段: 问题是,稍后将调用onChildRemoved时,如何删除所有那些ValueEventListener呢?还是不再需要它们了? 建议的处理这种情况的方法是什么?我应该将子键和侦听器存储在HashMap中并自己进行跟踪,还是可以通过某种方法删除给定Firebas