我使用Firebase将数据显示到textview中。我使用asynctask在后台加载数据,在加载时,我想在数据加载到我的textview之前显示加载消息。
但是我的加载数据弹出窗口没有显示。( ie 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
答案 0 :(得分:3)
你应该使用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) {
}
});
答案 1 :(得分:0)
当我从firebase获取数据时遇到了同样的问题,所以我记录了代码,发现问题是
onPostExecute()代码在Firebase的数据加载到应用之前运行。
所以我想到了一个hack,而不是在adapter.notifyDataSetChanged()
上调用onPostExecute()
我在加载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();
}
我希望这能解决你的问题。
答案 2 :(得分:0)
默认情况下,布局文件中进度条的可见性为 true ,因此我们只需将其设置为 false 。您只需要按如下所示在布局文件中执行此行。 假设这是最简单的进度栏初始化。
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"/>
最主要的是android:visibility="invisible".
希望它可以帮助许多人并节省时间。