Асинхронизация с Firestore - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь заставить ProgressBar вращаться, пока данные из Firestore загружаются в ListView.А потом, после загрузки - ProgressBar должен исчезнуть.Вот как я пытался это сделать, но в многопоточности я по-прежнему полный ноль.

Это внутренний класс, где я пытаюсь использовать async:

 ...
 ProgressBar prog;
        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);

        prog = findViewById(R.id.progressCircle);
        prog.setVisibility(View.INVISIBLE);

        class MyProgress extends AsyncTask<Void, Integer, Void> {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                prog.setVisibility(View.VISIBLE);
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                super.onPostExecute(aVoid);
                prog.setVisibility(View.INVISIBLE);
            }

            @Override
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);
            }

            @Override
            protected Void doInBackground(Void... voids) {

                query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            List<Places> placesList = new ArrayList<>();
                            for (DocumentSnapshot document : task.getResult()) {
                                Places places = document.toObject(Places.class);
                                System.out.println(places);
                                placesList.add(places);
                            }
                            if (placesList.size() > 0) {
                                System.out.println(placesList);
                                int placeCount = placesList.size();
                                Random randomGenerator = new Random();
                                ArrayList<Places> randomPlaceList = new ArrayList<>();
                                for (int i = 0; i < 3; i++) {
                                    int randomIndex = randomGenerator.nextInt(placeCount);;
                                    Places item = placesList.get(randomIndex);
                                    randomPlaceList.add(item);
                                }
                                ListView mListView = findViewById(R.id.place_list);
                                mAdapter = new PlaceAdapter(randomPlaceList, getBaseContext());
                                mListView.setAdapter(mAdapter);
                            }
                        } else {
                            error.setVisibility(View.VISIBLE);
                        }
                    }
                });
                return null;
            }
        }

И макет действия:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/card_new_bg">

<ProgressBar
    android:id="@+id/progressCircle"
    style="?android:attr/progressBarStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true" />

<ListView
    android:id="@+id/name_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentBottom="true"
    android:layout_centerInParent="true" >

</ListView>

1 Ответ

0 голосов
/ 08 июня 2018

Довольно избыточно использовать асинхронную задачу с вызовами Firebase, которые являются асинхронными.То, что вы можете просто сделать, это создать два метода:

public void showLoading(){
  prog.setVisibility(View.VISIBLE);
}

public void hideLoading(){
  prog.setVisibility(View.GONE);
}

И прямо перед вызовом асинхронного вызова firebase вызовите эти методы.Когда вы получите результат, вызовите метод сокрытия:

public void queryFirebase(){
    showLoading();
    query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                        @Override
                        public void onComplete(Task<QuerySnapshot> task) {
                            if (task.isSuccessful()) {
                                List<Places> placesList = new ArrayList<>();
                                for (DocumentSnapshot document : task.getResult()) {
                                    Places places = document.toObject(Places.class);
                                    System.out.println(places);
                                    placesList.add(places);
                                }
                                if (placesList.size() > 0) {
                                    System.out.println(placesList);
                                    int placeCount = placesList.size();
                                    Random randomGenerator = new Random();
                                    ArrayList<Places> randomPlaceList = new ArrayList<>();
                                    for (int i = 0; i < 3; i++) {
                                        int randomIndex = randomGenerator.nextInt(placeCount);;
                                        Places item = placesList.get(randomIndex);
                                        randomPlaceList.add(item);
                                    }
                                    ListView mListView = findViewById(R.id.place_list);
                                    mAdapter = new PlaceAdapter(randomPlaceList, getBaseContext());
                                    mListView.setAdapter(mAdapter);
                                }
                            } else {
                                error.setVisibility(View.VISIBLE);
                            }
                            hideLoading();
                        }
                    });
}

Затем вы просто делаете:

 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_result);

    prog = findViewById(R.id.progressCircle);
    prog.setVisibility(View.INVISIBLE);
    queryFirebase();
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...