如何在从Firebase数据库提取数据时显示加载消息? [英] How to show loading message while fetching data from Firebase Database?

查看:134
本文介绍了如何在从Firebase数据库提取数据时显示加载消息?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Firebase将数据显示到textview中。我使用一个asynctask加载数据在后台,而加载时,我想在数据加载到我的文本视图之前显示加载消息。

但我的加载数据弹出( ie doinBackground 方法完成它的工作立即),用户看到空的文字视图,只有在Firebase数据加载一段时间之后。



如何防止这种情况发生,并显示进程对话框,直到我的textview获取Firebase数据?

 这里是我的代码
< 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();

LoadFirebaseData()。execute();



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

@Override
保护无效onPreExecute()
{
尝试{
Dialog.setMessage(做某事...);
Dialog.show();
} catch(Exception e)
{
e.printStackTrace();



$ b @Override
保护无效onPostExecute(整数结果)
{

if(结果== 0)
{
//做一些事情
}
//完成完成进度条后
Dialog.dismiss();

$ b $覆盖
保护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);
}
$ b $ @覆盖
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);
}
$ b $ @Override
public void onCancelled(DatabaseError databaseError){

}
});

返回0;
}


}
}


< / code>
< / pre>

JSON树结构:

  Root 
Version_1_5
标题:TitleValue
作者:AuthorValue
文章:ArticleValue

解决方案

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

  private ProgressDialog Dialog = new ProgressDialog(LastPage.this); 
Dialog.setMessage(做某事);
Dialog.show(); (DataSnapshot Snapshot:dataSnapshot.getChildren)
mDatabase.child(version_1_5)。addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot){
()){
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 onCan (DatabaseError databaseError){

}
});


I'm using Firebase to display data into a textview. I use an asynctask to load data in the background, while loading, I want to show a loading message before the data loads into my textview.

But my loading data popup is not showing.(i.e doinBackground method finish it works immediately) and the user sees empty textviews and only after sometime that Firebase data loads.

How to prevent this and show process dialog until my textview get loaded with Firebase data?

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 tree structure:

Root
    Version_1_5
        Title:TitleValue
        Author:AuthorValue
        Article:ArticleValue

解决方案

you should use addListenerForSingleValueEvent to fetch the data from the node once not for the every single node

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) {

    }
});

这篇关于如何在从Firebase数据库提取数据时显示加载消息?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆