在哪里放置Firebase.setAndroidContext()函数

时间:2015-05-09 08:58:18

标签: android firebase

我试图与Firebase和Android玩一会儿 我有一个RegisterActivity和一个MainActivity。 我目前的流程是 - 从MainActivity开始 - 检查用户是否已注册,如果没有,请在注册时调用RegisterActivity后拨打MainActivity

我无法将Firebase.setAndroidContext()电话放在哪里 我有两个问题:

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

6 个答案:

答案 0 :(得分:19)

引用Firebase quickstart documentation

的引用(第4步)
  

必须使用Android Context初始化Firebase库一次。这必须在创建或使用任何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 中更新名称参数值:

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

答案 1 :(得分:3)

如Firebase的sample applications所示,您应该将其放在 int main(int argc, char **argv){ if(argc < 4){ usage(argv[0]); exit(EXIT_FAILURE); } // extract command line arguments std::stringstream ss; int diskCapacity = atoi(argv[1]);// ss << argv[1]; ss >> diskCapacity; int writeRatio = atoi(argv[2]);// ss << argv[2]; ss >> writeRatio; char *ofileName = argv[3]; // validate writeRatio if( (writeRatio < 0) || (writeRatio > 100) ) { std::cerr << argv[0] << ": writeRatio out of range [0,100]: " << writeRatio << std::endl; exit(EXIT_FAILURE); } std::ofstream outfile; outfile.open(ofileName); // seed rng std::chrono::high_resolution_clock::time_point time = std::chrono::high_resolution_clock::now(); std::minstd_rand rng(time.time_since_epoch().count()); /***** generate simluation sequence *****/ int diskSize = 0; std::vector<File> aliveFiles; int new_fid = 1; int nFilesCreated = 0; // create at least 1 file File f; f.id = new_fid++; f.size = 1; aliveFiles.push_back(f); diskSize++; nFilesCreated++; outfile << start(f.id) << std::endl; do { // start if( ((rng()%10) < 2) && (nFilesCreated < diskCapacity/4) ){ // new file f.id = new_fid++; f.size = 1; // add to disk aliveFiles.push_back(f); diskSize++; nFilesCreated++; outfile << start(f.id) << std::endl; continue; } // choose a file int new_fsize = -1; int new_fid = -1; if(!aliveFiles.empty()) { std::random_shuffle(aliveFiles.begin(), aliveFiles.end()); new_fid = (aliveFiles.back()).id; new_fsize = (aliveFiles.back()).size; } else { break; } // write if( (int)(rng() % 100) < writeRatio ) { // writeRatio% chance to write int block = 1 + (rng() % new_fsize); File newFile; if(block == new_fsize) { // writing new block diskSize++; new_fsize++; newFile.id = new_fid; newFile.size = new_fsize; aliveFiles.pop_back(); aliveFiles.push_back(newFile); } outfile << write(newFile.id, block) << std::endl; continue; } // end/read if(rng() % 100 == 0) { // end aliveFiles.pop_back(); outfile << end(new_fid) << std::endl; } else { if( (int)(rng() % 100) < (100-writeRatio) ){ // (100-writeRatio)% chance to read if(new_fsize > 1) { int block = 1 + (rng() % (new_fsize-1)); outfile << read(new_fid, block) << std::endl; } } } } while(diskSize < diskCapacity); // check that all files have ended, if not then clean up while(!aliveFiles.empty()) { new_fid = (aliveFiles.back()).id; aliveFiles.pop_back(); outfile << end(new_fid) << std::endl; } return 0; } 内。

Application

Source

<强> 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); } }

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

答案 2 :(得分:2)

我不知道FireBase,但我知道Android .. Context是关于应用程序环境的全局信息。您的ActivityContext,因此我非常确定Firebase.getAndroidContext()会检索您的应用Context getApplicationContext(),因为这似乎是明智的。

  

我应该只在应用程序中调用此函数一次还是在每个Activty中调用一次?

在需要Context时尊重FireBase代码时调用它 - 但我认为如果你在Application类中调用它会最适合

  

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

如果不是一次怎么办?你在哪里叫它?我想你会在任何需要Context的地方叫它吗?这样做无论问题1的答案如何,但您可以随时Class.thisgetBaseContext()View.getContext()

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

两者都可以。如果只设置一次,则应该在这里。其他任何地方,您的应用都会崩溃。调试器会说您尚未设置AndroidContext():

find

如果要用于多个活动,请创建一个与应用程序名称相同的类,请确保该类扩展了Application。

var list = new Array();
list.push({name: 'apple', id: 1})
list.push({name: 'bread', id: 2})

var index = list.indexOf(list.find(e => e.id === 2));
var result = index !== -1;

console.log('index', index);
console.log('result', result);

}

之后,使用以下命令更新manifest.xml文件中的应用程序标记:

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

答案 5 :(得分:0)

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

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

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