2016-09-21 2 views
4

Я использую Firebase для отображения данных в текстовом виде. Я использую asynctask для загрузки данных в фоновом режиме, при загрузке я хочу показать загружаемое сообщение, прежде чем данные загрузятся в мое текстовое представление.Как показать загружаемое сообщение при извлечении данных из базы данных Firebase?

Но моя загрузка всплывающее окно данных не отображается. (doinBackground метод т.е. закончить это работает сразу), и пользователь видит пустые TextViews и только после того, как когда-то, что Firebase загрузку данных.

Как предотвратить это и показать диалог процесса, пока мой текст не будет загружен данными 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

да я изменил код, но все-таки проблема с диалогизацией не решена. Моя основная проблема заключается в том, чтобы показать диалог прогресса, пока данные не будут загружены в текстовые поля –

+0

@GrumpyCat я отредактировал свой код, любезно проверил –

+1

привет, ваш код в порядке, но Dialog не отображается, и он немедленно уходит, когда я прикрепляю отладчик на Dialog.hide Я видел что-то, что работает Dialog. Я думаю, что основной причиной этого является datasnapshot.getvalue() работает в async-задаче, поэтому все остальные операторы выполняются немедленно, и поэтому Dialog.hide также выполняется, в настоящее время я использую Thread.sleep(), чтобы показать диалог. Мне нравится слышать ваши мысли об этом. –

0

Я была такая же проблема, когда я извлекал данные из базы, поэтому я зарегистрировал код и увидел, что проблема

Код onPostExecute() запускается до того, как данные из Firebase были загружены в приложение.

Так я думал о хака и вместо вызова adapter.notifyDataSetChanged() на onPostExecute() я назвал его в методе doInBackground() после загрузки данных из Firebase, а также спрятали прогресс бар в том же 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(); 
    } 

Я надеюсь, что это решает вашу проблему.

Смежные вопросы