【问题标题】:How to make FirebaseApp don't initialize again when back to MainActivity?如何让 FirebaseApp 在返回 MainActivity 时不再初始化?
【发布时间】:2022-11-03 13:27:56
【问题描述】:

我是学习 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);
    }

【问题讨论】:

  • 你如何回到 MainActivity?使用意图?
  • 是的。我使用 Intent 回到 MainActivity。

标签: android firebase


【解决方案1】:

如果使用onBackPressed() 返回MainActivity() 是一个选项,这意味着如果从MainActivity() 加载第二个活动并且您只想返回,请在onCreate()onCreate() 方法中编写Firebase 初始化逻辑@ 和在第二个活动中使用onBackPressed() 回到MainActivity(),如下所示:

而不是以下内容:

val intent = Intent(this, MainActivity :: class.java)
startActivity(intent)

写这个:

onBackPressed()

如果您在片段中,请使用:

activity?.onBackPressed()

这样,由于您使用的是onBackPressed() 函数而不是意图,因此不会创建MainActivity() 的新实例,并且将加载在后堆栈中可用的相同实例。因此,不会再次调用 onCreate()。相反,onResume() 被调用,因此初始化逻辑将不会运行。

【讨论】:

  • 刚刚编辑了我的答案。一探究竟。
  • 谢谢你。我已经尝试过您的解决方案,它执行时没有任何崩溃!
【解决方案2】:

您可以创建一个 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");
    }
}

您还需要做的另一件事是在AndroidManifest 中声明MyApplication 名称,在application 标签内,如下所示:

android:name=".MyApplication"

而已。如果有什么东西坏了,请告诉我。

【讨论】:

  • 我已经存在的 OnCreat 方法怎么样?我不知道如何在正确的地方写它。我将编辑我的帖子以显示代码。
猜你喜欢
  • 2016-10-26
  • 2017-03-03
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 2022-08-04
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
相关资源
最近更新 更多