1

I don't understand how is the Parse working? I download data in parse to my arraylist , but when I show the Pets.size inside (//here) method "done" it will show 4, but when I show pets.size outside the done's method it will show 0?

public class Test extends AppCompatActivity {
ArrayList<Pet> pets;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    pets = new ArrayList<>();
    ParseQuery<Pet> query = new ParseQuery<>("Pets");
    query.findInBackground(new FindCallback<Pet>() {
        @Override
        public void done(List<Pet> list, ParseException e) {
            if (e!=null){
                Toast.makeText(Test.this,"Error",Toast.LENGTH_LONG).show();
            }
            for (Pet pet : list){
                Pet newPet = new Pet();
                newPet.setName(pet.getName());
                newPet.setType(pet.getType());
                pets.add(newPet);
            }
            // here
        }
    });
    Toast.makeText(Test.this,"You have "+pets.size()+" pets",Toast.LENGTH_LONG).show();
}

Here's my Pet class:

@ParseClassName("Pets")
public class Pet extends ParseObject {
public String getName(){
    return getString("name");
}
public void setName(String name) {
    put("name", name);
}

public String getType(){
    return getString("type");
}
public void setType(String type) {
    put("type", type);
}
}

And an orther question , what should I do if I wanna save the data in local data?

0

3 Answers 3

0

Explanation:

findInbackground performs an operation to find all ParseObjects in a background thread (outside the main thread, or UI thread). So when it completes in the place where you have the comment

//here

That is when the background thread finishes it's call to find the objects. When you try to look at the size of the array outside that call where it shows size of 0, it is because it reached that point before the background thread finishes it's work (of adding to your array from objects it found).

What is happening is the operation for find() is happening in parallel with your main threads code.

And for your second question, make sure you enableLocalDatastore and then you can pin results from queries to your local cache. This data is stored on the device until the user deletes your app or clears cached data in settings.

Follow this guide to setup local cache Local Datastore with Parse

Note: A solution to your problem for when the background task of finding the pets is complete is to call a method from within the Callback for the findInBackground call that will handle the newly found Pet ParseObjects. Also remember to handle if the query fails either by finding no objects or some failure in connection / timeout.

Sign up to request clarification or add additional context in comments.

Comments

0

just calling pet.pin() or pet.pinInBackground(); you can save a parseObject in local storage , to query objects in local storage you need set query.fromPin(true) https://parse.com/docs/android/guide#objects-the-local-datastore

1 Comment

0

"done" method fires when the background task ends.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.