【问题标题】:How to show loading message while fetching data from Firebase Database?从 Firebase 数据库获取数据时如何显示加载消息?
【发布时间】:2016-09-21 15:34:02
【问题描述】:

我正在使用 Firebase 将数据显示到文本视图中。我使用异步任务在后台加载数据,在加载时,我想在数据加载到我的文本视图之前显示加载消息。

但我的加载数据弹出窗口没有显示。(doinBackground 方法完成它立即工作)并且用户看到空的文本视图,并且只有在 Firebase 数据加载的某个时间之后。

在我的 textview 加载 Firebase 数据之前,如何防止这种情况并显示进程对话框?

here is my code
<pre>
<code>
public class LastPage extends AppCompatActivity {
    TextView title, author, article;
    DatabaseReference mDatabase;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_last_page);


        title = (TextView) findViewById(R.id.last_page_title);
        author = (TextView) findViewById(R.id.last_page_author);
        article = (TextView) findViewById(R.id.last_page_article);

        mDatabase = FirebaseDatabase.getInstance().getReference();

        new LoadFirebaseData().execute();


    }

    private class LoadFirebaseData extends AsyncTask<Void, Void, Integer>
    {
        private ProgressDialog Dialog = new ProgressDialog(LastPage.this);

        @Override
        protected void onPreExecute()
        {
            try {
                Dialog.setMessage("Doing something...");
                Dialog.show();
            }catch (Exception e)
            {
                e.printStackTrace();
            }

        }

        @Override
        protected void onPostExecute(Integer result)
        {

            if(result==0)
            {
                //do some thing
            }
            // after completed finished the progressbar
            Dialog.dismiss();
        }

        @Override
        protected Integer doInBackground(Void... params) {

            mDatabase.child("version_1_5").child("title").addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    String temp = dataSnapshot.getValue(String.class);
                    title.setText(temp);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

            mDatabase.child("version_1_5").child("author").addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    String temp = dataSnapshot.getValue(String.class);
                    author.setText(temp);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

            mDatabase.child("version_1_5").child("article").addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    String temp = dataSnapshot.getValue(String.class);
                    article.setText(temp);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

            return 0;
        }


    }
}


</code>
</pre>

JSON 树结构:

Root
    Version_1_5
        Title:TitleValue
        Author:AuthorValue
        Article:ArticleValue

【问题讨论】:

  • 请分享你的json树
  • 在我的 json 树中有 3 个子节点,例如 root/version_1_5/title:valueOfTitle、root/version_1_5/aicle:valueOfArticle、root/version_1_5/author:valueOfAuthor

标签: android firebase firebase-realtime-database


【解决方案1】:

您应该使用 addListenerForSingleValueEvent 从节点获取数据一次,而不是针对每个节点

private ProgressDialog Dialog = new ProgressDialog(LastPage.this);
Dialog.setMessage("Doing something...");
Dialog.show();
mDatabase.child("version_1_5").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot Snapshot : dataSnapshot.getChildren()) {
            if(Snapshot.getKey().toString().equalsIgnoreCase("Title")){
                String temp = dataSnapshot.getValue(String.class);
                title.setText(temp);
            }
            else if(Snapshot.getKey().toString().equalsIgnoreCase("Author")){
                String temp = dataSnapshot.getValue(String.class);
                author.setText(temp);
            }
            else if(Snapshot.getKey().toString().equalsIgnoreCase("Article")){
                 String temp = dataSnapshot.getValue(String.class);
                article.setText(temp);
            }
        }
        Dialog.hide();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

【讨论】:

  • 是的,我更改了代码,但进度对话框问题仍未解决。我的主要问题是显示进度对话框,直到数据加载到文本视图中
  • 您好,您的代码很好,但是当我在 Dialog.hide 上附加调试器时,对话框没有显示并且它立即被关闭,我看到对话框正在运行。我认为这背后的主要原因是 datasnapshot.getvalue() 正在异步任务中工作,因此所有其他语句都会立即执行,这就是 Dialog.hide 也被执行的原因,目前我正在使用 Thread.sleep() 来显示对话框正在运行。我喜欢听听你对此的看法。
【解决方案2】:

由于在布局文件中进度条的可见性默认为true,所以我们只需要将其设置为false。您只需要在布局文件中执行此行,如下所示。 假设这是最简单的进度条初始化。

<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"/>

这里主要是android:visibility="invisible". 希望它能帮助很多人并节省他们的时间。

【讨论】:

    【解决方案3】:

    我在从 firebase 获取数据时遇到了同样的问题,所以我记录了代码,发现问题出在

    onPostExecute() 代码在 Firebase 中的数据加载到应用之前运行。

    所以我想到了一个 hack,我没有在 onPostExecute() 上调用 adapter.notifyDataSetChanged(),而是在从 Firebase 加载数据后在 doInBackground() 方法中调用了它,并且还像这样以相同的方法隐藏了进度条 -

    @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressBar.setIndeterminate(true);
            progressBar.setVisibility(View.VISIBLE);
        }
    
        @Override
        protected String doInBackground(String... params) {
            DataBaseReference = FirebaseDatabase.getInstance().getReference("child").child("something");
                DataBaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for (DataSnapshot ds : dataSnapshot.getChildren()) {
                            //Code for Fetching data from firebase
    
                        }
                        categoryDetailsFragmentAdapter.notifyDataSetChanged();
                        progressBar.setVisibility(View.GONE);
                    }
    
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
    
                    }
                });
            }
    
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            //progressBar.setVisibility(View.GONE);
            //categoryDetailsFragmentAdapter.notifyDataSetChanged();
        }
    

    我希望这能解决你的问题。

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 2022-01-07
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多