我在删除事件监听器时遇到问题.我在收集用户数据后使用在Activity中的onStart()内初始化一个监听器,应用程序向用户显示数据已上传的干杯,然后我调用onBackPressed()方法.
但我注意到,在活动暂停或停止后,侦听器仍在运行,因为它正在创建在onCancelled()事件下调用的toast.
所以我尝试重写onPause和onStop方法.
@Override
public void onPause() {
super.onPause();
// Remove post value event listener
if (mListener != null) {
mReadReference.removeEventListener(mListener);
}
}
Run Code Online (Sandbox Code Playgroud)
但这导致错误:
java.lang.RuntimeException: Unable to pause activity {deventree.com.thetimothyinitiative/deventree.com.thetimothyinitiative.Attendance}: java.lang.NullPointerException: listener must not be null
Run Code Online (Sandbox Code Playgroud)
我想在上传数据之后和活动调用onBackPressed()方法之前删除ValueEventListener
活动代码:
public class Attendance extends Activity {
Map<String, Boolean> td;
ArrayList<String> valu;
private SparseBooleanArray sbArray;
private static final String TAG = "Attendance";
CustomAdapter myAdapter;
ListView listview;
private DatabaseReference mReadReference;
private DatabaseReference mPostReference;
private ValueEventListener mListener;
private Button mButton;
private Button btnAll;
private Button btnNone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_attendance);
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String eid=user.getEmail();
System.out.println(eid);
//String[] parts = eid.split("@");
String[] parts = eid.split("\\.");
eid = parts[0];
System.out.println(eid);
Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat("E dd-MM-yyyy 'at' HH:mm:ss");
final ListView listview = (ListView) findViewById(R.id.listq);
// Initialize Database
mReadReference = FirebaseDatabase.getInstance().getReference()
.child("Lists").child(eid);
mPostReference = FirebaseDatabase.getInstance().getReference()
.child("Users").child(eid).child(ft.format(dNow)).child("Attendance Record");
//UI Elements
btnAll=(Button)findViewById(R.id.button40);
btnNone=(Button)findViewById(R.id.button33);
mButton=(Button)findViewById(R.id.button42);
btnAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
for (int i = 0; i < listview.getCount(); i++) {
listview.setItemChecked(i, true);
}
}
});
btnNone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int len=listview.getCount();
int lou=listview.getChildCount();
System.out.println(len+" "+lou);
for ( int i=0; i < listview.getCount(); i++) {
listview.setItemChecked(i, false);
}
}
});
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.out.println("Hello MF");
SparseBooleanArray checked = listview.getCheckedItemPositions();
for (int i=0; i<checked.size(); i++) {
if (checked.valueAt(i)) {
String item = listview.getAdapter().getItem(checked.keyAt(i)).toString();
td.put(item, true);
}
else{
String item = listview.getAdapter().getItem(checked.keyAt(i)).toString();
td.put(item, false);
}
}
mPostReference.setValue(td);
for (Map.Entry entry : td.entrySet()) {
System.out.println(entry.getKey() + ", " + entry.getValue());
}
Toast.makeText(getApplicationContext(), "Attendance Uploaded",Toast.LENGTH_SHORT).show();
onBackPressed();
}
});
}
@Override
public void onStart() {
super.onStart();
ValueEventListener mListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("here");
td = (Map<String,Boolean>) dataSnapshot.getValue();
for (Map.Entry<String, Boolean> entry : td.entrySet()) {
td.put(entry.getKey(),false);
}
valu = new ArrayList<String>(td.keySet());
ArrayAdapter<String> dataAdapter = new ArrayAdapter(getApplicationContext(), R.layout.rowview, valu);
listview = (ListView) findViewById(R.id.listq);
listview.setAdapter(dataAdapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
Toast.makeText(Attendance.this, "Failed to load list.",
Toast.LENGTH_SHORT).show();
}
};
mReadReference.addValueEventListener(mListener);
}
@Override
public void onStop() {
// Remove post value event listener
if (mListener != null) {
mReadReference.removeEventListener(mListener);
System.out.println("Doness");
}
super.onStop();
}
@Override
public void onPause() {
// Remove post value event listener
if (mListener != null) {
mReadReference.removeEventListener(mListener);
System.out.println("Here");
}
super.onPause();
}
Run Code Online (Sandbox Code Playgroud)
}
在super()打电话之前做.像这样 :
@Override
public void onPause() {
// Remove post value event listener
if (mListener != null && mReadReference!=null) {
mReadReference.removeEventListener(mListener);
}
super.onPause();
}
Run Code Online (Sandbox Code Playgroud)
同上Stop():
@Override
public void onStop() {
// Remove post value event listener
if (mListener != null && mReadReference!=null) {
mReadReference.removeEventListener(mListener);
}
super.onStop();
}
Run Code Online (Sandbox Code Playgroud)
编辑1:只需删除
onStart()修改您的onStart()以下代码中的声明:
@Override
public void onStart() {
super.onStart();
// Removed ValueEventListener mListener =new ValueEventListener() {
mListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("here");
td = (Map<String,Boolean>) dataSnapshot.getValue();
for (Map.Entry<String, Boolean> entry : td.entrySet()) {
td.put(entry.getKey(),false);
}
valu = new ArrayList<String>(td.keySet());
ArrayAdapter<String> dataAdapter = new ArrayAdapter(getApplicationContext(), R.layout.rowview, valu);
listview = (ListView) findViewById(R.id.listq);
listview.setAdapter(dataAdapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
Toast.makeText(Attendance.this, "Failed to load list.",
Toast.LENGTH_SHORT).show();
}
};
mReadReference.addValueEventListener(mListener);
}
Run Code Online (Sandbox Code Playgroud)
只需在上方onCreate()或上方声明onStart().
希望这可以帮助 :)