代码之家  ›  专栏  ›  技术社区  ›  Spike Johnson

与FireStore异步

  •  2
  • Spike Johnson  · 技术社区  · 7 年前

    我想让 ProgressBar 旋转,而数据来自 Firestore 正在加载到 ListView . 然后,在装载之后 进度条 应该消失了。我就是这么做的,但在多线程中,我还是一个完全的零。

    它是内部类,在这里我尝试使用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 回复  |  直到 7 年前
        1
  •  2
  •   Levi Moreira    7 年前

    在设计上是异步的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();
       }