gpt4 book ai didi

java - 让Java线程等待值

转载 作者:行者123 更新时间:2023-12-02 11:35:46 26 4
gpt4 key购买 nike

我需要通过用户的 UID 从我的 Firebase 数据库中检索用户名。这是我执行此操作的代码,但我不知道如何使其工作。该线程来自:

final String[] returnName = new String[1];

立即发送至:

return returnName[0].toString();

没有等待它先从监听器填充数据,因此返回值为 null 并且应用程序崩溃。这是该模块的完整代码:

private synchronized String getFriendName(String key) {
final String[] returnName = new String[1];
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Profiles").child(key).child("Name");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot datas : dataSnapshot.getChildren()) {
String userResult = datas.getKey();
if (userResult != null) {
returnName[0] = dataSnapshot.getValue().toString();
String temp = dataSnapshot.getValue().toString();
Toast.makeText(getBaseContext(), "Step 1: " + temp, Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "Step 2: " + returnName[0], Toast.LENGTH_SHORT).show();
}
}
}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});
return returnName[0].toString();
}

我花了几个小时阅读并尝试一些东西来让它工作,但在触发返回值之前我无法让代码真正正确执行。

有人可以帮助我吗?

@TaherKorshidi这是调用该函数的代码:

GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(currentLocation.latitude, currentLocation.longitude), radius);
geoQuery.removeAllListeners();

geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
friendID = key;
String friend = getFriendName(friendID);
}
}

回答,@TaherKorshidi,答案是在同一个监听器中获取其他值。没有其他办法可以解决这个问题,在你向我指出这个方向之前我不知道该怎么做。工作解决方案:

geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
getFriendKey = key;
if (getFriendKey != ping_userID) {
for(ContactsList d : UserList){
if(d.getUID() != null && d.getUID().contains(getFriendKey)) {
friendName = d.getName();
}
}
Toast.makeText(getBaseContext(), "Name: " + String.valueOf(friendName), Toast.LENGTH_SHORT).show();
getFriendLocation(getFriendKey, friendName);
}
}

最佳答案

您可以使用 asyncTask 来实现此目的,如下所示

public static class GetFriendName extends AsyncTask<String, Void, Void>{

String returnName;

@Override
protected void onPreExecute() {
super.onPreExecute();
//Show progress bar
}

@Override
protected Void doInBackground(String... strings) {
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Profiles").child(key).child("Name");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot datas : dataSnapshot.getChildren()) {
String userResult = datas.getKey();
if (userResult != null) {
returnName = dataSnapshot.getValue().toString();
String temp = dataSnapshot.getValue().toString();
}
}
}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});
return null;
}

@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
//Dismiss progress bar
showFriendName(returnName);
}
}

您可以从 onCreate() 调用此类,如下所示

GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(currentLocation.latitude, currentLocation.longitude), radius);
geoQuery.removeAllListeners();

geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
friendID = key;
new GetFriendName().execute(friendID);
}
}

然后您可以使用此方法将您的friendName分配给一个字符串值并在那里完成您的工作

private static void showFriendName(String friendName){
Toast.makeText(stackOverflowActivity, ""+friendName, Toast.LENGTH_SHORT).show();
String friend = friendName;
//Do your work here
}

此方法是从 onPostExecute() 调用的。

关于java - 让Java线程等待值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48960340/

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