在这个例子中,Firebase onDataChange() 运行 在哪里?
Where will Firebase onDataChange() run in this example?
我知道 Firebase 中的 onDataChange()
让我们说 addListenerForSingleValueEvent
在 上 运行ning。
我想了解如果我 运行 ExecutorService
:
中的这段代码会发生什么
runInBackground(new Runnable() {
@Override
public void run() {
ref.child("SOME_KEY")
.addListenerForSingleValueEvent
(new ValueEventListener() {
@Override
public void onDataChange(final DataSnapshot dataSnapshot) {
//.. do some work on Ui Thread or not??
}
@Override
public void onCancelled(DatabaseError databaseError) {
notificationRunning = false;
}
}
);
}
});
}
Android 中的主 Ui 线程上的 onDataChange() 仍然 运行 吗?
这是 ExecutorService
运行ner
/**
* Submits request to be executed in background.
* Threads submitted will be executed synchronously.
*
* @param runnable
*/
private void runInBackground(final Runnable runnable) {
mBackgroundExecutor.submit(new Runnable() {
@Override
public void run() {
try {
runnable.run();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
和 ExecutorService
mBackgroundExecutor = Executors
.newSingleThreadExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(runnable,
"Background executor service for OneSignal");
thread.setPriority(Thread.MIN_PRIORITY);
thread.setDaemon(true);
return thread;
}
});
侦听器回调总是在 main/UI 线程上 运行。用于添加侦听器的线程不会影响回调线程。您可以通过向输出线程名称的回调添加日志语句来确认这一点:
Log.d(TAG, "onDataChange: Thread=" + Thread.currentThread().getName());
我知道 Firebase 中的 onDataChange()
让我们说 addListenerForSingleValueEvent
在
我想了解如果我 运行 ExecutorService
:
runInBackground(new Runnable() {
@Override
public void run() {
ref.child("SOME_KEY")
.addListenerForSingleValueEvent
(new ValueEventListener() {
@Override
public void onDataChange(final DataSnapshot dataSnapshot) {
//.. do some work on Ui Thread or not??
}
@Override
public void onCancelled(DatabaseError databaseError) {
notificationRunning = false;
}
}
);
}
});
}
Android 中的主 Ui 线程上的 onDataChange() 仍然 运行 吗?
这是 ExecutorService
运行ner
/**
* Submits request to be executed in background.
* Threads submitted will be executed synchronously.
*
* @param runnable
*/
private void runInBackground(final Runnable runnable) {
mBackgroundExecutor.submit(new Runnable() {
@Override
public void run() {
try {
runnable.run();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
和 ExecutorService
mBackgroundExecutor = Executors
.newSingleThreadExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(runnable,
"Background executor service for OneSignal");
thread.setPriority(Thread.MIN_PRIORITY);
thread.setDaemon(true);
return thread;
}
});
侦听器回调总是在 main/UI 线程上 运行。用于添加侦听器的线程不会影响回调线程。您可以通过向输出线程名称的回调添加日志语句来确认这一点:
Log.d(TAG, "onDataChange: Thread=" + Thread.currentThread().getName());