2017-02-08 22 views
1

AsyncTaskから返されたデータを使って何かを行う方法を理解しようとしています。非同期タスク(Firebase)によって返されたデータを処理する

私は、非同期Firebase get操作(別のクラスに存在する操作)を呼び出すアクティビティを持っており、取り出されたArrayListのサイズでアクティビティに存在するTextViewを更新したいと考えています。ここでの活動のonCreateで呼び出さを取得し、私のFirebaseコールは次のとおりです。

public void getAttendants() { 

    ArrayList<AttendModel> attendees = new ArrayList<AttendModel>(); 
    FirebaseConnection.getInstance().getAllAttendeesFor(uuid, attendees); 

    Log.d("attendees", String.valueOf(attendees.size())); 
} 

、ここでは私のFirebase操作は次のとおりです。

public void getAllAttendeesFor(String UUID, final ArrayList<AttendModel> attendArray) { 
    final DatabaseReference attendObjects = getDatabaseTableWith(Constants.tableAttendObject); 

    Query queryRef = attendObjects.orderByChild(Constants.taAttendObjectUUID).equalTo(UUID); 

    queryRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
       HashMap<String, Object> attend = (HashMap<String, Object>) postSnapshot.getValue(); 
       String UUID = (String) attend.get(Constants.taAttendObjectUUID); 
       String userUsername = (String) attend.get(Constants.AttendObjectUserUsername); 

       AttendModel attendModel = new AttendModel(userUsername, UUID); 
       attendArray.add(attendModel); 

//here would like to notify or somehow return the attendArray 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

} 

のAndroidでこれの最良の方法は何ですか?アダプタのソートまたは完了ハンドラを実装する可能性はありますか?

+0

'ValueEventListener.onDataChange' *は*完了ハンドラです。その中からテキストビューを更新することを検討しましたか? –

+0

私はしましたが、現時点で私はFirebaseのすべての操作を行っているクラスを持っていて、呼び出されたクラスに戻り値を返すエレガントな方法を持っていたいと思います私はおそらく同じ操作を実行する必要がある他のクラスのコードの冗長性) – John

+0

私は 'onDataChange'で呼び出される私の関数の補完ハンドラを自分で作成する方法がありますか? – John

答えて

3

あなたが探しているのは、必要に応じて、簡単に作成できるJava 6(Android Java版)のための箱入り規約がないため、単一のパラメータで単一のメソッドを実装する簡単なインターフェイスが必要です。

interface Callback { 

void act(List<AttendModel> models); 
} 

ファイヤーベースのラッピング方法の引数として渡し、結果を呼び出します。

public void getAllAttendeesFor(String UUID, final ArrayList<AttendModel> attendArray, final Callback callback) { 
    final DatabaseReference attendObjects = getDatabaseTableWith(Constants.tableAttendObject); 

    Query queryRef = attendObjects.orderByChild(Constants.taAttendObjectUUID).equalTo(UUID); 

    queryRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
       HashMap<String, Object> attend = (HashMap<String, Object>) postSnapshot.getValue(); 
       String UUID = (String) attend.get(Constants.AttendObjectUUID); 
       String userUsername = (String) attend.get(Constants.AttendObjectUserUsername); 

       AttendModel attendModel = new AttendModel(userUsername, UUID); 
       attendArray.add(attendModel); 

       callback.act(attendArray) 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

} 

は、あなたの上位レベルの方法で:

public void getAttendants() { 

    ArrayList<AttendModel> attendees = new ArrayList<AttendModel>(); 
    FirebaseConnection.getInstance().getAllAttendeesFor(uuid, attendees, 
     new Callable<List<AttendModel) { 
      void act(List<AttendModel> attendees){ 
      //here you can update the UI 
      Log.d("attendees", String.valueOf(attendees.size())); 
      } 
     }; 


} 

ちょうどあなたがfirebaseクエリのOnDataChangeの方法は、メインスレッドで呼び出された場合にのみ、UIを更新できることに注意してください。

+1

"firebaseクエリのonDataChangeメソッドがメインスレッドで呼び出された場合にのみUIを更新できます" –

+0

よく、素晴らしい!この問題を指摘したかっただけです。 – yosriz

関連する問題