2017-08-03 2 views
0

私はこのような基本的な質問をすることをお詫びしますが、私は実際にFirebaseを把握するのに苦労しており、これを動作させることはできません!Firebaseからオブジェクトを読み込むにはどうしたらいいですか?

私のアクティビティでは、データベースからChartオブジェクトを表示する必要があります。チャートは別のクラスで定義されています。 OnCreateの方法では、私は次の操作を行います。

Intent intent = getIntent(); 
    chartKey = intent.getStringExtra("ChartKey"); 
    chart = new Chart(chartKey); 
    chart.initialiseChart(); 
    chartName.setText(chart.getName()); 

だから、私は、以前の活動から通過されたチャートキーで読みます。私はそれを使って新しいChartオブジェクトを作成します。次に、そのキーを使用して、データベースからChartオブジェクトを読み込み、オブジェクトの残りの部分(initialiseChartで実行しようとしているもの)を設定し、Chart名を取得して表示する必要があります。

しかし、私はそれを正しく動作させることはできません - initialiseChartはキーセットだけでChartを返しています(渡された時と同じです)。

私が言うように
public class Chart { 
     private String uid, key, name, details; 

     public Chart() {} 
     public Chart(String chartKey) { 
      this.key = chartKey; 
     } 

     @Exclude 
     public Map<String, Object> toMap() { 
      HashMap<String, Object> result = new HashMap<>(); 
      result.put("uid", uid); 
      result.put("key", key); 
      result.put("name", name); 
      result.put("details", details); 
      return result; 
     } 

     public String getKey() { return this.key; } 
     public String getUid() { return this.uid; } 
     public String getName() { return this.name; } 
     public String getDetails() { return this.details;} 

public void initialiseChart() { 

    if(this.key == null) return; 

    DatabaseReference mChartReference = FirebaseDatabase.getInstance().getReference() 
      .child("charts").child(this.key); 

    mChartReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Chart chart = dataSnapshot.getValue(Chart.class); 
      setUpChart(chart); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 
} 

private void setUpChart(Chart chart) { 
    this.uid = chart.uid; 
    this.name = chart.name; 
    this.details = chart.details; 
} 

、問題は活動から「initialiseChart」を呼び出した後、チャートがまだ設定されていない、ということである。ここでは

は私のチャートクラスの関連する部分です。私はそれがデータベースからデータを取得する前に、この行に続いているのかもしれないと推測していますか?おそらく私は何らかの非同期タスクを許可する必要がありますか...何か?

これを行う適切な方法は誰でも教えてください。私はちょうどそれと一緒に円で回って、自分自身を混乱させている。私はJavaにも比較的新しいので、助けにはならない。私はこれがおそらく非常に基本的なことだと知っていますが、私はドキュメンテーションと私が見つけることができる多くの例を見てきましたが、これを行うものは何も見えません。

ありがとうございました!

答えて

1

これは動作しない理由は、addListenerForSingleValueEventがAsynchroniesプロセスであるためです。このコードを実行すると:

Intent intent = getIntent(); 
chartKey = intent.getStringExtra("ChartKey"); 
chart = new Chart(chartKey); 
chart.initialiseChart(); 
chartName.setText(chart.getName()); // here the data isn't ready yet. 

chartName.setText(chart.getName()); - >オブジェクトグラフには、使用できるデータがありません。何を行う可能性がありますしてリスナーを追加することです:今、理にかなっているが、それは「リスナー」を好きではないです

Intent intent = getIntent(); 
chartKey = intent.getStringExtra("ChartKey"); 
chart = new Chart(chartKey); 
chart.initialiseChart(new Runnable{ 
    public void run(){ 
     chartName.setText(chart.getName()); // this should run on ui thread   
    } 
}); 
+0

おかげで、 - 私はそれを絞り込む必要があることを意味青色のボックスを取得しています。私がそれをクリックすると、「リスナー」のオプションが示唆されますが、どれも正しいように見えません。それとも私は自分の欲張り人を書こうとしていたのですか? – Sharon

+1

Runnableオブジェクトを渡すことができます。 RunOnUiThreadがRunnableを受け入れるので、さらに優れています。 –

+0

ありがとうございました。実際には、chartNameのテキストビューを渡して毎回onDataChangedを更新すると便利な場合があるので、ユーザーが別の場所に変更した場合は再表示されます使用される、右か? – Sharon

関連する問題