[英]Intent Not Starting Activity (will work for one activity, but not the other)
[英]Is it better to pass more information in an intent to an activity or call the database in the other activity
我正在使用Firebase制作一個應用程序,用戶必須登錄才能使用該應用程序。 僅當用戶使用FirebaseAuth
和FirebaseAuth.AuthStateListener
登錄后,MainActivity才會啟動。
因此,在主活動中,我具有有關當前用戶的所有信息。
我的問題是,在導航到其他活動時,是通過與用戶(或任何對象)有關的Intent將更多附加信息傳遞給SecondActivity
更好,還是從SecondActivity
的Firebase數據庫讀取更好?
(兩者都適合我的應用程序,但是我正在考慮好的編程風格/結構以及資源,速度和性能)
同樣值得一提的是,我要記住,幾乎所有活動的屏幕/ UI都會通過有關當前對象的信息來更新,因此我希望該應用程序盡可能快且響應迅速。 對於我現在在項目中擁有的某些代碼,我必須使用Thread.sleep(x)
,讓UI等待數據庫完成讀取,然后再更新UI。 這就是我當前在Google Maps Activity
。
用戶的PK是用於登錄的Gmail。每個用戶都有幾個ArrayList(包含對象),使用應用程序時它們會變得更大,因此最終將傳遞大量信息。
看一下下面的示例代碼,但是不要太在意細節,這只是我現在在其中輸入的一些代碼。 重要的是如何在每個活動中檢索和傳遞信息的一般結構:
主要活動:
Intent i = new Intent(this, SecondActivity.class);
i.putExtra("email", thisUser.getEmail());
startActivity(i);
SecondActivity:
private FirebaseDatabase Db;
private DatabaseReference destinationRef, userRef;
private String email;
private User thisUser;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.SecondActivity);
email = getIntent().getStringExtra("email");
Db = FirebaseDatabase.getInstance();
userRef = Db.getReference().child("Users");
destinationRef = Db.getReference().child("Destinations");
getInfoFromDb();
}
private void getInfoFromDb(){
userRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User u;
for(DataSnapshot data : dataSnapshot.getChildren(){
u = data.getValue(User.class);
u.setUid(data.getKey());
if(email.equalsIgnoreCase(u.getEmail())){
thisUser = u;
/* Update something else, based on this info */
}
}
}
@Override
public void onCancelled(DataSnapshot dataSnapshot) { }
});
destinationRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Destination d;
for(DataSnapshot data : dataSnapshot.getChildren()){
d = data.getValue(Destination.class);
d.setUid(data.getKey());
if(thisUser.getCurrentTrip().getDestinationName().equalsIgnoreCase(d.getDestinationName())){
/*Something else, update UI or whatever */
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) { }
});
}
這是另一個(簡短的)示例:
主要活動:
Intent i = new Intent(this, SecondActivity.class);
i.putExtra("email", thisUser.getEmail());
i.putExtra("rank", thisUser.getRank());
i.putExtra("points", thisUser.getPoints());
i.putExtra("someArray", thisUser.getSomeArray());
i.putStringArrayListExtra("somethingElse", thisUser.getSomeStringArrayList());
// And let's say we put in a lot more information
startActivity(i);
第二活動
thisEmail = getIntent().getStringExtra("email");
thisRank = getIntent().getStringExtra("rank");
thisEmail = getIntent().getIntExtra("points");
thisSomeArray = getIntent().getStringArrayExtra("someArray");
thisArrayList = getIntent().getStringArrayListExtra("somethingElse");
哪種方法更好?
1)第一個代碼示例,我在SecondActivity
從數據庫中讀取信息。
2)將整個thisUser對象(可能會變得很大,必須使用序列化)從MainActivity
發送到SecondActivity
。
3)將具有意圖的MainActivity
更多(可能很多)信息傳遞給其他Activites。
同樣,我在考慮良好的編程結構,實踐,風格,並擔心速度,響應能力和資源。
我會從數據庫中檢索數據,因為您說過可以提供更多信息。 因此,最好僅在SecondActivity
從數據庫中檢索數據。
如果您使用intent
傳遞數據,則意味着您在活動之間共享數據而不存儲數據。
也可以說您要進行涉及一個以上節點的查詢(可能是根下的兩個nodes
(例如join
)或嵌套nodes
),則必須從數據庫中檢索數據才能執行此操作
想想測試。
在一種情況下,您需要測試框架傳遞所有這些額外的數據以僅測試第二種方法。 耦合已增加。 該方法的內聚性較低,因為它不能獨立運行。
在另一種情況下,測試框架不需要傳遞額外的數據,因為該方法本身會檢索所需的信息。 耦合減少。 該方法更具凝聚力。
我的$ 0.02
您的問題是針對正在開發的應用程序的。
通過意圖傳遞數據或將其保留在數據庫中非常取決於它是什么類型的數據,以及由於某種原因丟失該數據時的行動計划。
優點和缺點 :意圖傳遞數據
按計划傳遞數據對於臨時數據或推斷數據非常有用,因為它是為執行某些操作而計算的,因此不應在每次加載活動時都進行持久化或檢索。
與DB方法相比,代碼將更加復雜,因為每次您從一個活動遍歷到另一個活動時,都必須添加代碼以傳遞意圖或檢查傳遞的數據或在當前活動中添加新數據。 如果系統崩潰,則會丟失所有數據和狀態。
優點和缺點 :DB方法
在數據庫中包含數據為您提供了一種方法,可以在發生崩潰時恢復狀態,或者將其用作將來的檢查點。 這也意味着您必須維護表和代碼來處理它們,但是這將是干凈的,因為接口將是干凈的和已定義的。 同樣,可以有多個調用來保存和檢索數據。
您還需要考慮數據是否敏感。
簡而言之,它完全取決於您的應用程序需求,並且您必須確定計算需要哪些數據以及需要保留哪些數據,並因此使用混合方法來獲得更高的性能和可靠性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.