2016-09-21 43 views
4

我正在使用Firebase將數據顯示到文本視圖中。我使用asynctask在加載時在後臺加載數據,我想在數據加載到我的文本視圖之前顯示加載消息。 (doinBackground方法完成後立即生效),並且用戶只會在Firebase數據加載一段時間後纔看到空文字視圖。如何在從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

請分享您的JSON樹 –

+0

在我的JSON樹它有3周的childNodes像這根/ version_1_5 /標題:valueOfTitle,根/ version_1_5/aticle:valueOfArticle,根/ version_1_5 /作者:valueOfAuthor –

回答

2

你應該使用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) { 

    } 
}); 
+0

是的,我改變了代碼,但仍進度對話框問題沒有解決。我的主要問題是顯示進度對話框,直到數據加載到textviews –

+0

@GrumpyCat我已編輯我的代碼,結帳 –

+1

你好你的代碼是好的,但對話框沒有顯示,它會立即解僱,當我在Dialog.hide上附加調試器我看到做了一些Dialog運行的東西。我認爲這背後的主要原因是datasnapshot.getvalue()在異步任務中工作,所以所有其他語句立即執行,這就是爲什麼Dialog.hide也得到執行,目前我正在使用Thread.sleep()來顯示對話框運行。我喜歡聽到你的想法。 –

0

我,當我有同樣的問題正在從Firebase中獲取數據,因此我登錄了代碼並看到問題是

onPostExecute()代碼在Firebase數據加載到應用程序之前運行。

所以我想到了一個黑客的和,而不是在onPostExecute()調用adapter.notifyDataSetChanged()我把它叫做在doInBackground()方法從火力地堡數據加載後,也躲到這樣在同一methond進度條 -

@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(); 
    } 

我希望這可以解決您的問題。

相關問題