【问题标题】:Android asynchronous Task finishes before Firebasequery completedAndroid异步任务在Firebasequery完成之前完成
【发布时间】:2017-08-07 07:20:51
【问题描述】:

我想在异步任务中执行一些 Firebasequery。问题是我必须调用 Thread.sleep(5000);得到预期的结果列表。否则,列表始终为空,因为任务在没有等待 Firebase 查询完成的情况下结束。 任务从后台服务调用,并通过 Task.execute().get(); 等待结果;

是否有可能在不调用 Thread.sleep() 的情况下获得异步任务结果?

     @Override
protected ArrayList<Product> doInBackground(InventoryCheckService... params) {
    this.service = params[0];
    result = new ArrayList<>();
    DatabaseReference userReference = DatabaseAdapter.getInstance().getUserReference();
    if(userReference != null){
        userReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                HashMap<String, Product> changedProducts = dataSnapshot.getValue(new GenericTypeIndicator<HashMap<String, Product>>() {
                });
                if(changedProducts != null){
                    Iterator<String> iterator = changedProducts.keySet().iterator();
                    String nextExpirationDate = getDateForTommorow();
                    while (iterator.hasNext()) {
                        String nextKey = iterator.next();
                        Product product = changedProducts.get(nextKey);
                        if (product.getBestBeforeDate().containsKey(nextExpirationDate)) {
                            result.add(product);
                        }
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    return result;
}

提前感谢您的帮助! :)

【问题讨论】:

  • 你为什么在异步任务中执行 Firebasequery,我猜所有的 firebase 查询都是异步执行的。
  • @KamranAhmedKhan,此任务由后台服务调用。这是一个预定的后台服务(我正在使用 Firebase.Jobdispatcher,它扩展了服务)。据我了解,UI线程在执行服务时被阻塞,操作很长,所以我将逻辑移到了任务中......Android IntentService

标签: android firebase android-asynctask firebase-realtime-database android-service


【解决方案1】:

最后我解决了我的问题。我想在任务执行后提出一个意图。我没有从服务中启动 Intent,而是将代码放入异步任务中:

 @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            HashMap<String, Product> changedProducts = dataSnapshot.getValue(new GenericTypeIndicator<HashMap<String, Product>>() {
            });
            if(changedProducts != null){
                Iterator<String> iterator = changedProducts.keySet().iterator();
                String nextExpirationDate = getDateForTommorow();
                while (iterator.hasNext()) {
                    String nextKey = iterator.next();
                    Product product = changedProducts.get(nextKey);
                    if (product.getBestBeforeDate().containsKey(nextExpirationDate)) {
                        result.add(product);
                    }
                }
                 // start Intent here...
            }

现在我不必在任务完成之前睡觉,因为它是启动 Intent 的任务的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多