我有一种方法可以将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
创建另一个变量?
答案 0 :(得分:1)
自己处理所有低级别的线程工作并不是一个好主意。
加载到Android你可以:
您的问题: “不止一次启动一个线程永远不合法。特别是,一旦完成执行,线程可能无法重启。”(c)http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#start()
答案 1 :(得分: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。