2017-02-09 56 views
1

我想返回一個布爾值,但返回的值總是爲false,即在這種情況下爲0。valueEventListener的返回值java

校驗變量是一個實例變量,並且當按鈕被按下時的功能下面獲取調用。

private boolean checkAnswerSubmission() { 

    DatabaseReference answerDatabase = FirebaseDatabase.getInstance().getReference().child("userPuzzleHistory").child(uid); 
    answerDatabase.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.hasChild(String.valueOf(imagename))) { 
       check = 1; 
      } else { 
       check = 0; 
      } 
    //here the value check is working fine but the value cannot be returned from here. 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
    //here the value returned is always 0 
    if (check == 1) 
     return true; 
    else 
     return false; 

} 
+0

Java沒有全局變量。 – shmosel

+0

我的不好。已經做出了改變..任何幫助將是偉大的@shmosel –

+0

創建您的變量靜態。 –

回答

4

與所有的異步操作一樣,我經常以回調方式進行操作。

您的解決方案可能像這樣工作:

  1. 創建一個簡單的回調接口(我有我在,我在使用幾乎每一個應用程序庫)

    public interface SimpleCallback { 
        void callback(Object data); 
    } 
    
    // You could do it as well generic, that's what I do in my lib: 
    public interface SimpleCallback<T> { 
        void callback(T data); 
    } 
    

然後重新設計您的方法的簽名是這樣的:

private void checkAnswerSubmission(@NonNull SimpleCallback<boolean> finishedCallback) { 

    DatabaseReference answerDatabase = FirebaseDatabase.getInstance().getReference().child("userPuzzleHistory").child(uid); 
    answerDatabase.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // This will simple call your callback containing a boolean true/false 
      finishedCallback.callback(dataSnapshot.hasChild(String.valueOf(imagename))); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

你可以這樣稱呼:

checkAnswerSubmission(new SimpleCallback<boolean>() { 
    @Override 
    void callback(boolean data) { 
     if (data) { 
      // true was returned 
     } else { 
      // false was returned 
     } 
    } 
}); 
+0

謝謝你這真的很有幫助。 @Grisgram –

+0

謝謝@格里格 –

2

數據庫引用是同一線程上沒有做到爲您的運行功能。它只是爲從服務器接收數據時才進行的異步調用添加一個偵聽器。

所以你的程序初始化一個監聽器,並轉到這一行的下一個語句。

if (check == 1) 
     return true; 
    else 
     return false; 

所以,如果你的校驗值被初始化它很可能會以0爲值,並始終:

answerDatabase.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.hasChild(String.valueOf(imagename))) { 
       check = 1; 
      } else { 
       check = 0; 
      } 
    //here the value check is working fine but the value cannot be returned from here. 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

現在的程序不等待響應從它執行服務器接收返回false。