我有一个方法可以将数据从 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
创建另一个变量?
最佳答案
自己处理所有低级线程工作不是一个好主意。
根据 Android,您可以:
- 使用 AsyncTask(但请注意它们有很多缺点,例如在某些情况下会泄漏上下文等),
- 我可以建议你进入RxJava - 这是在您的应用中使用异步工作的轻松方式。
- 要从 Firebase“下载”数据,您可以使用 FCM(推送通知)按需加载数据。
那你的问题呢: “多次启动一个线程是不合法的。特别是,一个线程一旦完成执行就不能重新启动。”(c) http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#start()
关于android - 如何一次又一次地调用线程中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45551779/