如何在从Firebase数据库获取数据时显示加载消息?

时间:2016-09-21 15:34:02

标签: android firebase firebase-realtime-database

我使用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

3 个答案:

答案 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". 希望它可以帮助许多人并节省时间。