如何在firebase中处理异步调用
Posted
技术标签:
【中文标题】如何在firebase中处理异步调用【英文标题】:How to handle Asynchronous call in firebase 【发布时间】:2018-03-15 10:08:30 【问题描述】:我必须将来自 firebase 的响应返回到另一个函数,该函数将对该数据进行进一步处理。
public ArrayList<String> getDatas(String number)
final ArrayList<String> requestList = new ArrayList<>();
final FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference reference = database.getReference("Users").child(number).child("request_list");
final DatabaseReference requestReference = database.getReference("Request");
reference.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
Log.i(TAG, "onDataChange: ");
for (final DataSnapshot data : dataSnapshot.getChildren())
Log.i(TAG, "onDataChange: data: " + data.getValue());
requestList.add(data.getValue().toString());
Log.i(TAG, "onDataChange: for ended");
@Override
public void onCancelled(DatabaseError databaseError)
);
return requestList;
由于 firebase 操作是异步的,我无法等待数据返回。有人可以帮我解决这个问题吗?
【问题讨论】:
重新思考您的设计。您真的不想等到数据可用。 所以我应该在每次添加新数据时通知 不,只要有数据就异步更新你的 UI。 永远不要试图以任何理由阻塞主线程。这将为您的用户带来糟糕的体验,并可能导致 ANR。您应该习惯 Firebase API 都是异步的,并且您需要在调用侦听器后创建或更新您的视图。 【参考方案1】:你可以使用回调方法
http://developer.android.com/reference/java/util/concurrent/Callable.html
通过使用 Callable 接口,您可以将参数作为函数传递,我添加了一个简单的代码 sn-p 以便理解。
public class MainActivity<V> extends Activity
Callable<String> doLogin=null;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
doLogin=new Callable<String>() //created but not called now.
@Override
public String call() throws Exception
//make some piece of code
return "something"; //or false
;
CheckSession checkSession=new CheckSession("sessionName");
String sessionKey="";
try //we are sending callable to the DAO or any class we want
sessionKey=checkSession.getSessionKey(doLogin);
catch (Exception e)
e.printStackTrace();
public class CheckSession
String sessionName="";
Callable<String> func=null;
public CheckSession(String sessionName)
super();
this.sessionName = sessionName;
public String getSessionKey(Callable<String> doLogin) throws Exception
func=doLogin;
return (String) func.call();
【讨论】:
以上是关于如何在firebase中处理异步调用的主要内容,如果未能解决你的问题,请参考以下文章
只有在 SwiftUI 和 Firebase 中完成循环中的异步调用时,如何才能返回函数?