我是學習 Android Studio 的初學者,英語不好。
我在一個 android 應用程式中有兩個 Firebase 專案,并在下面撰寫這些代碼。
FirebaseOptions options1 = new FirebaseOptions.Builder()
.setProjectId("fd-login-20e78")
.setApplicationId("...")
.setApiKey("...")
.build();
FirebaseOptions options2 = new FirebaseOptions.Builder()
.setProjectId("fd-login1-dc1f7")
.setApplicationId("...")
.setApiKey("...")
.build();
FirebaseApp.initializeApp(this , options1, "first");
FirebaseApp.initializeApp(this , options2, "secondary");
FirebaseApp first = FirebaseApp.getInstance("first");
FirebaseApp secondary = FirebaseApp.getInstance("secondary");
它作業得很好,沒有任何崩潰。但是當我嘗試從其他活動回傳 MainActivity 時,它總是崩潰并出現此錯誤:
引起:java.lang.IllegalStateException:FirebaseApp 名稱首先已經存在!
我知道問題的發生是因為 FirebaseApp 再次初始化。當我回到 MainAcitvity 時,我怎么能阻止它?
我曾嘗試過這種方法來解決問題,但沒有奏效。下面的代碼使 App 立即崩潰。錯誤表明它沒有初始化任何東西。
if (FirebaseApp.getApps(this).isEmpty()) {
FirebaseApp.initializeApp(this , options1, "first");
FirebaseApp.initializeApp(this , options2, "secondary");
}
編輯
public class MainActivity extends AppCompatActivity implements View.OnClickListener, RadioGroup.OnCheckedChangeListener {
private TextView tv_register, tv_forget;
private EditText ed_email1, ed_password1;
private Button btn_login;
private RadioGroup radioGroup;
RadioButton rb1, rb2, rb3;
private FirebaseAuth mAuth, mAuth2, mAuth3, login;
SharedPreferences sharedPreferences;
SharedPreferences.Editor editor;
FirebaseApp first,secondary;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_register = findViewById(R.id.tv_register2);
tv_register.setOnClickListener(this);
tv_forget = findViewById(R.id.tv_forget2);
tv_forget.setOnClickListener(this);
btn_login = findViewById(R.id.btn_login2);
btn_login.setOnClickListener(this);
ed_email1 = findViewById(R.id.ed_email2);
ed_password1 = findViewById(R.id.ed_password2);
rb1 = findViewById(R.id.rb1);
rb2 = findViewById(R.id.rb2);
rb3 = findViewById(R.id.rb3);
radioGroup = findViewById(R.id.radioGroup);
radioGroup.setOnCheckedChangeListener(this);
FirebaseOptions options1 = new FirebaseOptions.Builder()
.setProjectId("fd-login-20e78")
.setApplicationId("...")
.setApiKey("...")
.build();
FirebaseOptions options2 = new FirebaseOptions.Builder()
.setProjectId("fd-login1-dc1f7")
.setApplicationId("...")
.setApiKey("...")
.build();
FirebaseApp.initializeApp(this , options1, "first");
FirebaseApp.initializeApp(this , options2, "secondary");
first = FirebaseApp.getInstance("first");
secondary = FirebaseApp.getInstance("secondary");
mAuth = FirebaseAuth.getInstance(first);
mAuth2 = FirebaseAuth.getInstance(secondary);
}
uj5u.com熱心網友回復:
如果回傳MainActivity()使用onBackPressed()是一個選項,這意味著如果從第二個活動加載MainActivity()并且您只想回傳,請在onCreate()方法中撰寫 Firebase 初始化邏輯MainActivity()并onBackPressed()在第二個活動中使用以回傳MainActivity()類似這樣:
而不是以下內容:
val intent = Intent(this, MainActivity :: class.java)
startActivity(intent)
寫這個:
onBackPressed()
如果您在片段中,請使用:
activity?.onBackPressed()
這樣,由于您使用的是onBackPressed()函式而不是意圖,MainActivity()因此不會創建新的實體,并且將加載后堆疊中可用的相同實體。因此,不會再次呼叫 onCreate()。而是onResume()呼叫,因此初始化邏輯將不會運行。
uj5u.com熱心網友回復:
您可以創建一個Application類,其onCreate()方法僅在應用程式啟動時呼叫,之后不再呼叫。為此,創建一個名為MyApplication(或任何您喜歡的名稱)的單獨 java 類,用類擴展它,Application并在它的onCreate()方法中,執行您的代碼,如下所示:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
FirebaseOptions options1 = new FirebaseOptions.Builder()
.setProjectId("fd-login-20e78")
.setApplicationId("...")
.setApiKey("...")
.build();
FirebaseOptions options2 = new FirebaseOptions.Builder()
.setProjectId("fd-login1-dc1f7")
.setApplicationId("...")
.setApiKey("...")
.build();
FirebaseApp.initializeApp(this , options1, "first");
FirebaseApp.initializeApp(this , options2, "secondary");
FirebaseApp first = FirebaseApp.getInstance("first");
FirebaseApp secondary = FirebaseApp.getInstance("secondary");
}
}
您還需要做的另一件事是在標簽內宣告MyApplication名稱,如下所示:AndroidManifestapplication
android:name=".MyApplication"
而已。如果有什么東西壞了,請告訴我。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486760.html
