2017-08-07 9 views
1

FirebaseのデータをArrayListにロードする方法があります。この後、ArrayListを使ってRecyclerViewを構築します。私は別のスレッドにデータをロードすることに決めました。以下は私のコードです:時間の経過後にスレッド時間内にメソッドを呼び出す方法は?

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

    citiesRecyclerView = 
    (RecyclerView)findViewById(R.id.recyclerView); 

    handler = new Handler() 
    { 

     @Override 
     public void handleMessage(Message msg) { 
      super.handleMessage(msg); 


      if(msg.what==1) 
      { 

       cityAdapter = new 
       CityAdapter(MainActivity.this,cities) ; 
       citiesRecyclerView.setAdapter(cityAdapter); 

      } 
     } 
    }; 

    t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
     //method that loads data into List.If this method was 
     //successfully done,then I send message 1 to Handler 

      loadDataFromFirebase(); 
     } 
    }); 

    t.start(); 
    //other operations below 
} 

希望は、すべて理解できます。コードは正常に動作します。そして私の問題は、スレッドでloadDataFromFirebaseメソッドを再度使用する必要があることです。 loadDataFromFirebaseメソッドを呼び出すためにもう一度t.start()に電話したかったのですが、thread already startedというエラーがありました。私はこのコードを書き込むことによって、そのチェック:

if(t.getState()== Thread.State.NEW) 
     t.start(); 
    else 
     someMethod(); 

else文は上記働きました。

私の質問は: 1)loadDataFromFirebaseメソッドは本当にこの方法で別のスレッドで動作しますか? 2)別のスレッドでloadDataFromFirebaseメソッドを再度呼び出すにはどうすればよいですか?もう一度Threadの別の変数を作成する必要がありますか?

答えて

1

低レベルのスレッド作業をすべて自分で処理することはお勧めできません。

あなたは、AndroidにできAccroding:

  1. 使用AsyncTask(しかし、彼らがそのようないくつかのケースなどのコンテキスト漏れなど多くの欠点を持っていることの通知)、
  2. 私はRxJavaに入るためにあなたを示唆可能性 - それはですあなたのアプリで非同期作業を使用する無痛な方法。
  3. Firebaseからデータをダウンロードするには、必要に応じてデータを読み込むために、おそらくFCM(プッシュ通知)を使用できます。 「。これは、複数回のスレッドを開始する法的なことはありません、それが実行を完了すると、特に、スレッドを再開することはできません」(C)http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#start()

    :あなたの質問について

そして、何

1

firebase SDKを使用している場合、リアルタイムデータベース機能を使用できます。そのたびに照会する必要はありません。

あなたは1回だけ購読して更新情報を入手してください。たとえば:

firebaseReference.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     // This method is called once with the initial value and again 
     // whenever data at this location is updated. 
     YourDataObject value = dataSnapshot.getValue(YourDataObject.class); 
     Log.d(TAG, "Value is: " + value); 
    } 

    @Override 
    public void onCancelled(DatabaseError error) { 
     // Failed to read value 
     Log.w(TAG, "Failed to read value.", error.toException()); 
    } 
}); 

あなたはドキュメントhereを読むことができます。

+0

しかし、毎回特定の子供からのデータを読んでいます(((私は毎回質問することなく可能ではないとは思っていません) – abay

+1

あなたは特定の子供の変更を購読することができます –

+0

私はする必要がありますそれはメインスレッドですか? – abay

関連する問題