2017-08-07 54 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方法。我想再次打電話給t.start()以便撥打loadDataFromFirebase方法,但有錯誤thread already started。我通過編寫此代碼檢查:

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

else聲明以上工作。

而我的問題是: 1)loadDataFromFirebase方法真的在另一個線程通過這種方式嗎? 2)如果在另一個線程中再次調用loadDataFromFirebase方法,如果發生了什麼?我是否需要再爲Thread創建另一個變量?

回答

1

處理所有低級別的線程工作並不是一個好主意。

Accroding到Android您可以:

  1. 使用的AsyncTask(但是請注意,它們有許多缺點,例如在某些情況下等情況下泄漏),
  2. 我可以建議你進入RxJava - 這是一個在您的應用程序中使用異步工作的無痛方式。
  3. 要從Firebase下載數據,您可以使用FCM(推送通知)按需加載數據。

那你的問題: 。「這是從來沒有的法律,以啓動一個線程不止一次特別是,一個線程可能無法一旦完成執行重啓」(C)http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#start()

1

如果您使用的是Firebase SDK,則可以使用實時數據庫功能,因此無需每次查詢。

您應該只訂閱一次並獲取更新。例如:

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