gpt4 book ai didi

android - 全局变量的值在 ValueEventListener 中初始化后被重置

转载 作者:行者123 更新时间:2023-11-29 15:40:22 25 4
gpt4 key购买 nike

我有一个名为“bg”的全局变量。它在 firebase 数据库引用“myRef”的 ValueEventListener 中初始化

但是如果我尝试在 valueeventlistener block 之外使用变量的值,则该变量为空。就好像它正在被重置。

我是 android 的新手。请让我知道出了什么问题。

代码如下:

package com.example.tejasvi.donorfinder;

import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;

import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

private GoogleMap mMap;
private FirebaseAuth mAuth;

public String latlng[],bg;

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);

mAuth = FirebaseAuth.getInstance();

Bundle bundle = getIntent().getExtras();

String s= bundle.getString("Phone");

String path="Active Requests/"+mAuth.getCurrentUser().getUid()+"/"+s+"/Blood Group";

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference(path);


myRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

bg=dataSnapshot.getValue().toString();
}

@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(MapsActivity.this, "Error", Toast.LENGTH_LONG).show();

}
});

Toast.makeText(MapsActivity.this, bg, Toast.LENGTH_SHORT).show(); //bg is empty here

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;

}
}

dataSnapshot.getValue()的值为“A+ve”

JSON文件如下:

{
"Active Requests": {
"3R8XGIM5uSRv3sxQZ2sqqUnIjQ62": {
"9849949799": {
"Blood Group": "B+ve",
"Date of Requirement": "3/1/17",
"Direct or Replacement?": "Direct donation",
"Donation Type": "Whole Blood",
"For Self?": "Yes",
"Hospital Name": "Shekhar Hospital",
"Location": "12.945793000000002,77.56759339999999",
"Name": "Poorna Chandra Tejasvi",
"Units": "2"
}
},
"YL5oVxmua4gktNM2TwwPavL1Tj32": {
"123456789": {
"Blood Group": "A+ve",
"Date of Requirement": "1/1/17",
"Direct or Replacement?": "Direct donation",
"Donation Type": "Whole Blood",
"For Self?": "No",
"Hospital Name": "Columbia Asia Hospital - Hebbal",
"Location": "13.0509869,77.5937892",
"Recipient Name": "jssnxn",
"Recipient Relation": "Married",
"Units": "3"
}
}
}
}

最佳答案

这里没有魔法。您只是看到了异步加载的影响,大多数现代网络都是基于异步加载构建的。

如果您在调试器中运行代码或添加一些日志记录语句,则最容易理解,如下所示:

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference(path);

System.out.println("Before adding listener");
myRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("In onDataChange");
}

@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});

System.out.println("After adding listener");

当你像这样运行代码时,它会打印:

Before adding listener

After adding listener

In OnDataChange

这可能不是您所期望的,但这是处理 Firebase 和大多数现代 Web API 时的预期行为。由于加载数据可能需要未知的时间(毕竟它必须从互联网上的某个地方获取),代码不会等待数据返回,而是在您附加听众。然后,当数据可用时,它会调用您的 onDataChange(),您就可以使用这些数据了。

这种行为一开始非常令人困惑,所以如果不能立即弄清楚,请不要担心。重要的是要意识到这种行为是正常的并且是现代网络编程的一部分。所以不要试图解决它(即让代码等待数据)。相反:尝试将您的问题重新构建为一个更适合这种异步性质的模型。

我发现最容易将我的问题从“首先加载数据,然后在 toast 中显示”改写为“开始加载数据,然后在加载数据后,在 toast 中显示”。这将转换为以下代码:

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference(path);

myRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
bg=dataSnapshot.getValue().toString();
Toast.makeText(MapsActivity.this, bg, Toast.LENGTH_SHORT).show();
}

@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});

关于android - 全局变量的值在 ValueEventListener 中初始化后被重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41407194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com