如何在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 中完成循环中的异步调用时,如何才能返回函数?

如何通过异步调用 uid 从 Firebase 查询数据

在 React-Native 中的非异步函数中调用异步函数 - Firebase

异步firebase调用后SwiftUI不更新变量

如何获取异步 Firebase 数据读取的进度?

在异步任务中快速返回 Firebase