如何在从Firebase数据库提取数据时显示加载消息? [英] How to show loading message while fetching data from Firebase Database?
问题描述
我正在使用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
$ p $
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屋!