2016-09-21 97 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(); 
    } 

我希望这可以解决您的问题。

相关问题