【问题标题】:Where to put Firebase.setAndroidContext() functionFirebase.setAndroidContext() 函数的放置位置
【发布时间】:2015-05-09 08:58:18
【问题描述】:

我正在尝试使用 Firebase 和 Android。
我有一个RegisterActivity 和一个MainActivity。 我目前的流程是 - 从MainActivity 开始 - 检查用户是否已注册,如果没有,请致电RegisterActivity - 注册后致电MainActivity

我不知道在哪里拨打 Firebase.setAndroidContext() 电话。
我有两个问题:

  1. 我应该只在Application 中调用此函数一次还是在每个Activty 中调用一次?
  2. 如果问题 1 的答案只有一次,那我应该把它放在哪里?

谢谢大家, 乔拉。

【问题讨论】:

  • 为什么你不想开始注册活动 - 检查用户登录 - 如果为真:开始 MainActivity?
  • 根据当前文档:“在新的 SDK 中,不再需要调用 Firebase.setAndroidContext(),因此您可以将其从代码中删除” firebase.google.com/support/guides/firebase-android - 在 设置 Android 上下文和启用离线持久性部分

标签: android firebase


【解决方案1】:

引用Firebase quickstart documentation(第 4 步):

Firebase 库必须使用 Android Context 初始化一次。这必须在创建或使用任何 Firebase 引用之前发生。

创建MyApplication.java

public class MyApplication extends android.app.Application {

    @Override
    public void onCreate() {
        super.onCreate();

        //Previous versions of Firebase
        Firebase.setAndroidContext(this);

        //Newer version of Firebase
        if(!FirebaseApp.getApps(this).isEmpty()) {
            FirebaseDatabase.getInstance().setPersistenceEnabled(true);
        }
    }
}

并更新 AndroidManifest.xml 中的 name 参数值:

<application 
        android:label="@string/app_name"
        android:name=".MyApplication">
...
</application>

【讨论】:

    【解决方案2】:

    正如在 Firebase 的 sample applications 中看到的,您应该将其放在您的 Application 中。

    package com.firebase.androidchat;
    
    import com.firebase.client.Firebase;
    
    /**
     * @author Jenny Tong (mimming)
     * @since 12/5/14
     *
     * Initialize Firebase with the application context. This must happen before the client is used.
     */
    public class ChatApplication extends android.app.Application {
        @Override
        public void onCreate() {
            super.onCreate();
            Firebase.setAndroidContext(this);
        }
    }
    

    Source


    Firebase.getAndroidContext()

    设置应用程序上下文后,您可以在任何需要的地方使用它。您可以随时随地检索它。 我还建议使用 Firebase.getAndroidContext() 而不是将其存储到变量中以防止 MemoryLeaks

    【讨论】:

    • 感谢您的回答 - 这也是正确的,但我只能将一个标记为答案。感谢您的帮助!
    • @gioravered 我先回答了:P 但没问题。还请在 github 上查看他们的示例应用程序。他们帮助你;)
    • @gioravered 实际上,您标记为正确的另一个答案并没有回答您最初的问题如何使用getAndroidContext()
    • @mikepenz 是否也不建议对 firebase 的根引用也只创建一次?还是每次活动一次?如何处理?
    【解决方案3】:

    我不知道 FireBase,但我知道 Android。Context 是有关应用程序环境的全局信息。您的ActivityContext,所以我很确定Firebase.getAndroidContext() 检索到您的应用程序Context,即getApplicationContext(),因为这看起来很明智。

    我应该只在Application中调用一次这个函数还是在每个Activty中调用一次?

    当你需要一个关于 FireBase 代码的 Context 时调用它 - 但我认为如果你在你的 Application 类中调用它会最合适

    如果问题1的答案只有一次,那我应该把它放在哪里?

    如果不是一次呢?你在哪里叫它?我想你会在任何你需要的地方调用它Context 对吧?不管问题 1 的答案如何,都可以这样做,但您可以随时选择Class.thisgetBaseContext()View.getContext()

    【讨论】:

    • 对不起,我的意思是 setAndroidContext() 而不是 getAndroidContext()。
    • 好吧,即使我仍然在点上,我也会很珍惜。哈哈,对吧?@gioravered
    【解决方案4】:

    在新的 SDK 中,不再需要调用 Firebase.setAndroidContext(),因此您可以将其从代码中移除。

    您可以在此处阅读有关更新和更改的信息: https://firebase.google.com/support/guides/firebase-android

    【讨论】:

      【解决方案5】:

      两者都可以。如果你只设置一次,那么它应该在这里。在其他任何地方,您的应用都会崩溃。调试器会说你还没有setAndroidContext():

      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          Firebase.setAndroidContext(this);
      // The rest of your code goes here
      

      如果您想用于多个活动,则创建一个与应用同名的类,确保该类扩展 Application。

      public class NameOfApp extends Application {
      
      @Override
      public void onCreate() {
          super.onCreate();
      
          Firebase.setAndroidContext(this);
      }
      

      }

      之后,使用以下内容更新 manifest.xml 文件中的应用程序标签:

      android:name=".NameOfApp"
      

      【讨论】:

        【解决方案6】:

        Firebase.setAndroidContext(this);代码替换为mRef = FirebaseDatabase.getInstance().getReference();

        并在 onCreate 方法之前添加private DatabaseReference mRef;

        我希望这适用于 Android Studio 3.5 版本。

        【讨论】:

          猜你喜欢
          • 2022-11-23
          • 1970-01-01
          • 2012-06-05
          • 1970-01-01
          • 2011-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多