Skip to content Skip to sidebar Skip to footer

Call Method In Another Thread On Completion

Currently, I am using firebase Realtime Database. Hence, my data changes come from another thread. Hence, I have no control on when the fresh data update comes over. How do I then

Solution 1:

What you are looking for are callbacks.

Callbacks are practically mandatory when dealing with asynchronous calls, because when you call an asynchronous task, you are basically asking a worker thread to work for you. It may take 1 second, 10 seconds, 10 minutes, etc, and you can not know for sure. What you can do is delegate that same worker thread and tell her "hey, reply back when you finish the task I gave you". Enter the callbacks!

You can check for more documentation regarding callbacks here

Say that you have your query defined with the ValueEventListener

query.addListenerForSingleValueEvent(newValueEventListener() {
   @OverridepublicvoidonDataChange(DataSnapshot data) {

   }
}

What you should do is have a callback method that replies back as soon as the query listener returns a value (in other words, when your query is executed). So, have a method like 'onResponseReceivedFromFirebase' and implement it on the callback

publicclassMyActivityextendsActivity {

    @OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    // Implement your callback here with the parameters you want (for instance, I used a String there)publicvoidonResponseReceivedFromFirebase(String argument){
        Log.d(MyActivity.class,argument);
    }

    ....

    query.addListenerForSingleValueEvent(newValueEventListener() {
       @OverridepublicvoidonDataChange(DataSnapshot data) {
            onResponseReceivedFromFirebase("the response arrived!");
       }
    }

    ...

}

@Edit Base on your updated code, I would proceed with the following

@OverridepublicvoidonDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot routeInstruc : dataSnapshot.getChildren()) {
         routeInstruc.getValue(RouteInstructions.class)
        .removeRouteInstructions();
    }
    DatabaseReferencemRef2= FirebaseDatabase.getInstance().getReference()
                    .child("Routes")
                    .child(routeId);
            mRef2.removeValue();
   // Implement the callback here 
   MyActivity.this.onResponseReceivedFromFirebase("We have received a response from   dataChanged");
}

@Edit 2 : On Frank van Puffelen's remark, the onDataChange method already runs on the Main Thread, thus allowing you to change any element on the UI.

Very import : If the processing payload of the outcoming data is considerably large, you should pass that same processing into another thread (e.g. An AsyncTask) to avoid making your app non-responsive.

Solution 2:

While the Firebase client handles all network and disk IO on a separate thread, it invokes the callback to your code on the main thread. So you can update the UI straight from onDataChange(), without having to worry about the thread yourself.

In fact, all examples in the Firebase documentation update the UI from their onDataChange() (or onChild...()) callbacks. One example from the database quickstart:

publicvoidonDataChange(DataSnapshot dataSnapshot){
    // Get Post object and use the values to update the UI
    Post post = dataSnapshot.getValue(Post.class);
    mAuthorView.setText(post.author);
    mTitleView.setText(post.title);
    mBodyView.setText(post.body);
}

Post a Comment for "Call Method In Another Thread On Completion"