我的活动中有一个textView - 比如“Username”。它应该从Firebase数据库填充。我在Asynctask中进行Firebase查询,以免阻止活动。但是,这意味着在Firebase查询完全执行之前,TextView首先加载。
那么在AsyncTask中执行Firebase查询并且用户名已知之后,刷新此textBox的最佳方法是什么? 我不想showprogressBar并在从数据库中提取数据时阻止活动。这会破坏在AsyncTask中执行此操作的目的。
AsyncTask的代码在
之下 private class CheckUserLoginAndRetrieveDataFromFirebase extends AsyncTask <Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... voids) {
if (thisAppUser!=null) {
setUserDataForToday();
if (createNewNode) { //This is the first time the User is logging in
createUsersNodesForFirstTime();
}
}
return null;
}
AsyncTask中的Firebase查询代码位于
之下public static void setUserDataForToday() {
setProperDatabaseReference(); //This sets reference to user specific nodes in the database
myRef.child("dashboard").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Dashboard dashboard = dataSnapshot.getValue(Dashboard.class);
if (dataSnapshot.getChildrenCount() > 0) {
createNewNode = false;
if (dashboard.checkIfTodaysDateExistsInDatabase()) {
//An entry for todays date exists in database, so no data change needed
myDashboard = dashboard;
}
答案 0 :(得分:2)
我希望这个例子可以帮助你
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setUserDataForToday();
Log.d("MainActivity", "Process is not blocked");
}
public void setUserDataForToday() {
Log.d("MainActivity", "Called method");
DatabaseReference database = FirebaseDatabase.getInstance().getReference();
database.child("users").child("1").child("name").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
String userName = dataSnapshot.getValue(String.class);
Log.d("MainActivity", "Received value: " + dataSnapshot.getValue());
dataSnapshot.getKey();
TextView textView = (TextView) findViewById(R.id.textUserName);
textView.setText(userName);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d("MainActivity", "DB error: " + databaseError.getMessage());
}
});
}
public void onClick(View v) {
setUserDataForToday();
}
}
答案 1 :(得分:0)
如果您正在使用Android工作室点击工具&gt; Firebase&gt;实时数据库并按照说明操作。这将帮助您入门。如果您想要拥有用户,并且只希望某些用户访问某些内容,则可能需要单击工具&gt; firebase&gt;身份验证。弗兰克是正确的,不需要异步任务。