【问题标题】:How to handle Asynchronous call in firebase如何在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 都是异步的,并且您需要在调用侦听器后创建或更新您的视图。

标签: java android firebase asynchronous


【解决方案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();

    }

}

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 2019-11-15
    • 2022-12-03
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2018-07-21
    相关资源
    最近更新 更多