目前,我使用的是firebase实时数据库。因此,我的数据更改来自另一个线程。因此,我无法控制何时更新新的数据。然后我如何知道何时调用以刷新UI?
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int pos = viewHolder.getAdapterPosition();
mListRoute.get(pos).removeRoute();
refreshUI();
}
public void removeRoute() {
//Delete all the Route Instructions
DatabaseReference mRef = FirebaseDatabase.getInstance().getReference()
.child("Routes")
.child(routeId)
.child("Route Instructions");
mRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot routeInstruc : dataSnapshot.getChildren()) {
routeInstruc.getValue(RouteInstructions.class)
.removeRouteInstructions();
}
DatabaseReference mRef2 = FirebaseDatabase.getInstance().getReference()
.child("Routes")
.child(routeId);
mRef2.removeValue();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
谢谢
你要找的是回调。
在处理异步调用时,回调实际上是强制性的,因为当您调用异步任务时,您基本上是在要求一个辅助线程为您工作。
可能需要1秒、10秒、10分钟等时间,您无法确定。您所能做的就是委托同一个worker线程,并告诉她“嘿,当您完成我给您的任务时,请回复”。
输入回调!
您可以在这里查看有关回调的更多文档
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot data) {
}
}
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
// Implement your callback here with the parameters you want (for instance, I used a String there)
public void onResponseReceivedFromFirebase(String argument){
Log.d(MyActivity.class,argument);
}
....
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot data) {
onResponseReceivedFromFirebase("the response arrived!");
}
}
...
}
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot routeInstruc : dataSnapshot.getChildren()) {
routeInstruc.getValue(RouteInstructions.class)
.removeRouteInstructions();
}
DatabaseReference mRef2 = FirebaseDatabase.getInstance().getReference()
.child("Routes")
.child(routeId);
mRef2.removeValue();
// Implement the callback here
MyActivity.this.onResponseReceivedFromFirebase("We have received a response from dataChanged");
}
@edit2:根据Frank van Puffelen的评论,onDataChange方法已经在主线程上运行,因此允许您更改UI上的任何元素。
非常导入:如果传出数据的处理负载相当大,您应该将相同的处理传递到另一个线程(例如AsyncTask)中,以避免使您的应用程序无响应。
我试图用一个自定义对象创建一个新线程,然后从主线程调用这个自定义对象方法。其思想是,主线程可以继续执行其他任务,而自定义对象可以继续在第二个线程中工作: 输出为: 它应该更像这样: 所以主线程被阻塞,直到方法完成。主线程是否在第二个线程中等待完成(作为返回类型为空,我认为情况不会如此)?还是在第一个线程中执行,因此阻塞了它? 我知道使用下面的代码,我可以在另一个线程中执行,但它每次都会从头开始创建
我正在我的UI线程中调用一个方法。在这个方法中创建了一个新线程。我需要UI线程等待这个新线程完成,因为我需要这个线程的结果来继续UI线程中的方法。但我不想让UI在等待时冻结。有没有办法让UI线程在不忙的情况下等待?。
问题内容: 有没有简单的解决方案,可以在新线程中使用JPA将数据保存到数据库中? 我基于Spring的Web应用程序允许用户管理计划的任务。在运行时,他可以创建和启动预定义任务的新实例。我正在使用spring的TaskScheduler,并且一切正常。 但是我需要将每个被激发任务的布尔结果保存到数据库中。我怎样才能做到这一点? 编辑:我必须概括我的问题:我需要从任务在我的@Service类上调用方
我正在努力实现以下目标: 我有两种方法——1。公共方法1 2。公共方法2 你能帮助: 问题是,只有在使用method1.subscribe()时,控件才会转到方法1。我无法返回值或抛出异常基于状态字段从方法1返回。 当method1.map()或method1.filter()时,控件甚至不会转到方法1 当方法1返回Mono.empty(),那么控件不会切换到If清空(方法2)
我正在阅读这篇文章,关于从一个线程中断另一个线程的建议是 “”“如果正确实施,以下几种方法应该可以奏效。 您可以让两个线程定期检查一些常见的标志变量(例如,将其称为stopNow),并安排两个线程在完成时进行设置。(标志变量需要是volatile…或正确同步的。) 您可以让两个线程定期调用线程。isInterrupted()方法,查看它是否已被中断。然后每个线程都需要调用线程。完成后,在另一个上中
我试过这样的事情: create(new observable.onsubscribe>(){@override public void call(subscriber>subscriber){subscriber.onnext(getList());subscriber.oncompleted();}}).subscribe... 但是这个订阅在一个迭代上,onNext只传递完整的列表,而不是列