我试图与Firebase和Android玩一会儿
我有一个RegisterActivity
和一个MainActivity
。
我目前的流程是 - 从MainActivity
开始 - 检查用户是否已注册,如果没有,请在注册时调用RegisterActivity
后拨打MainActivity
。
我无法将Firebase.setAndroidContext()
电话放在哪里
我有两个问题:
Application
中调用此函数一次,还是在每个Activty
调用一次?谢谢大家, Giora。
答案 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
<强> 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
是关于应用程序环境的全局信息。您的Activity
是Context
,因此我非常确定Firebase.getAndroidContext()
会检索您的应用Context
getApplicationContext()
,因为这似乎是明智的。
我应该只在应用程序中调用此函数一次还是在每个Activty中调用一次?
在需要Context
时尊重FireBase代码时调用它 - 但我认为如果你在Application
类中调用它会最适合
如果不是一次怎么办?你在哪里叫它?我想你会在任何需要如果问题1的答案只有一次,那么我应该把它放在哪里?
Context
的地方叫它吗?这样做无论问题1的答案如何,但您可以随时Class.this
,getBaseContext()
或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版本。