2017-10-10 5 views
0

私はこれで新しくなりました!誰かが私を助けることができますか? ここで私は非同期プログラミングを扱っていることを知っています。文字列を返そうとしていますが、それでもnullを返しています。FirebaseのonDataChange()以外のデータを使用しようとしています

誰かが私が間違っている場所を教えてもらえますか?

public interface OnGetDataListener { 
    public void onStart(); 
    public void onSuccess(DataSnapshot data); 
    public void onFailed(DatabaseError databaseError); 
} 

public void mReadDataOnce(String email ,String child, final OnGetDataListener listener) { 
    listener.onStart(); 
    myRef.child(email).child(child).limitToFirst(1).addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      listener.onSuccess(dataSnapshot); 
     } 

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

private String mCheckInforInServer(String email ,String child) { 
    final String[] returnvalue = new String[1]; 

    mReadDataOnce(email ,child, new OnGetDataListener() { 

     @Override 
     public void onStart() { 
      //DO SOME THING WHEN START GET DATA HERE 
     } 

     @Override 
     public void onSuccess(DataSnapshot data) { 
      returnvalue[0] = data.getValue().toString(); 
      //DO SOME THING WHEN GET DATA SUCCESS HERE 
     } 

     @Override 
     public void onFailed(DatabaseError databaseError) { 
      //DO SOME THING WHEN GET DATA FAILED HERE 
     } 
    }); 

    return returnvalue[0] ; 
} 

その後、私はそれを呼び出しています:ログインがnull印刷され

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Log.i(" ","HIMANSHU" + mCheckInforInServer("a","name")); 
    Log.i(" ","HIMANSHU" + mCheckInforInServer("a","email")); 
} 

、私は値が欲しいです。助けてください!

答えて

0

コードを読んで理解してください。コードは以下の順序で実行されますmCheckInforInServer()方法内側

は:

  1. returnvalue
  2. タイプOnGetDataListenerの匿名インスタンスを作成し初期化します。
  3. mReadDataOnce()方法にタイプOnGetDataListenerのこのインスタンスを渡すと、この方法は、いくつかの待ち時間とその使用して、ネットワークが。この待ち時間はより大きくなりますので、完了するまでにしばらく時間がかかるだろう、それは望んでいる時はいつでもreturnvalue(の値を変更するにはOnGetDataListenerインスタンスを使用してみましょうほとんど99.9999%のケースでは、次の2文の実行中の待ち時間)mReadDataOnce()以来
  4. は非同期で動作は、プログラム制御は、それが上に行くとmCheckInfoInServer()
  5. リターンの現在価値の実現、0.0001%でケースを続行することができますあなたが必要とする価値になります。

だから、その0.0001%の大文字小文字にする必要があります。

または、あなたはそれが完了すると、すべてがうまくいけば、あなたが99.9999%のケースで必要な値を与えるされる、あなたのメイン・アクティビティ内のメソッドを呼び出すためにあなたのmReadDataOnce()を求めることができます。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mReadDataOnce("a" ,"email", new OnGetDataListener() { 

     @Override 
     public void onStart() { 
      //DO SOME THING WHEN START GET DATA HERE 
     } 

     @Override 
     public void onSuccess(DataSnapshot data) { 
      Log.i("", "HIMANSHU" + data.getValue().toString()); 
      //DO SOME THING WHEN GET DATA SUCCESS HERE 
     } 

     @Override 
     public void onFailed(DatabaseError databaseError) { 
      //DO SOME THING WHEN GET DATA FAILED HERE 
     } 
    }); 
    mReadDataOnce("a" ,"email", new OnGetDataListener() { 

     @Override 
     public void onStart() { 
      //DO SOME THING WHEN START GET DATA HERE 
     } 

     @Override 
     public void onSuccess(DataSnapshot data) { 
      Log.i("", "HIMANSHU" + data.getValue().toString());    
      //DO SOME THING WHEN GET DATA SUCCESS HERE 
     } 

     @Override 
     public void onFailed(DatabaseError databaseError) { 
      //DO SOME THING WHEN GET DATA FAILED HERE 
     } 
    }); 
} 

コードでの更新:あなたはこのように気にいらを試すことができます

実は、ここで私は、データベースからレコードクラスに格納する値にしようとしています。お返事のための

public interface OnGetDataListener { 
    public void onStart(); 
    public void onSuccess(DataSnapshot data); 
    public void onFailed(DatabaseError databaseError); 
} 

public void mReadDataOnce(String email ,String child, final OnGetDataListener listener) { 
    listener.onStart(); 
    myRef.child(email).child(child).limitToFirst(1).addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      listener.onSuccess(dataSnapshot); 
      record.setName(dataSnapshot.getValue().toString()); 
     } 

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

そしてのonCreateでレコードクラスから値を取得する()

mReadDataOnce("a" ,"email", new OnGetDataListener() { 

     @Override 
     public void onStart() { 
      //DO SOME THING WHEN START GET DATA HERE 
     } 

     @Override 
     public void onSuccess(DataSnapshot data) { 
      Log.i("", "HIMANSHU" + data.getValue().toString()); 
      record.setName(data.getValue().toString()); 
      //DO SOME THING WHEN GET DATA SUCCESS HERE 
     } 

     @Override 
     public void onFailed(DatabaseError databaseError) { 
      //DO SOME THING WHEN GET DATA FAILED HERE 
     } 
    }); 

    Log.i(" ","HIMANSHUKUSHWAHA"+record.getName()); 
    //Printing null 
+0

感謝。しかし、私はonCreate()のmReadDataOnce()メソッドの外で返された値にアクセスしようとしています。 –

+0

などです。たとえば、メインアクティビティ内で 'doSomethin()'と呼ばれるメソッドでそのデータを使用したいとします。次に、 'OnSource()'の実装の中で単に 'doSomething(data)'を呼び出すことができます。 – ZeekHuge

+0

私はそれを試みましたが、それでもnullを返します。 –

関連する問題