Java 使用方法创建可运行类,该方法使用对UI主线程执行后的回调
我有一个问题,这个代码是否正确。我怀疑Runnable类中的后台执行是在run()方法中执行,还是也在构造函数中执行。。。很明显,它正在运行(),但我想确保我的想法Java 使用方法创建可运行类,该方法使用对UI主线程执行后的回调,java,android,multithreading,handler,runnable,Java,Android,Multithreading,Handler,Runnable,我有一个问题,这个代码是否正确。我怀疑Runnable类中的后台执行是在run()方法中执行,还是也在构造函数中执行。。。很明显,它正在运行(),但我想确保我的想法 class Tracer implements Runnable { private Handler handler; private OnTracerCompletedListener callback; Tracer(OnTracerCompletedListener callback) { t
class Tracer implements Runnable {
private Handler handler;
private OnTracerCompletedListener callback;
Tracer(OnTracerCompletedListener callback) {
this.callback = callback;
handler = new Handler(); // <--- is this on main UI thread?
}
@Override
public void run() {
// do something on background thread
// after task completed notify invoker of Tracer using callback
handler.post(new Runnable() {
@Override
public void run() {
if(callback != null) callback.onTracedCompleted();
}
}
}
}
类跟踪器实现可运行{
私人经办人;
私有的CompletedListener回调;
跟踪程序(OnTracerCompletedListener回调){
this.callback=回调;
handler=new handler();//构造函数和初始值设定项中的代码与方法run
中的代码之间的差异是何时从哪个线程调用代码
因此,创建实例时,Tracer
的构造函数中的代码将立即被调用。它将在调用方的线程中运行。方法run
将在后台运行(我只是假设,因为我不知道应用程序的体系结构)
因此,应该在后台执行的所有操作都应该在方法run
中完成。好吧,如果我从thread1(通常是UI主线程)调用Tracer,并且下一个方法运行在thread2上,那么如果我在Tracer构造函数中实例化了Helper(android),那么handler.post cause回调将在thread1上执行(在本例中为UI主线程)短答案:是长答案:当您在UI线程中创建Tracer实例时,将在UI线程上调用Tracer的构造函数。然后在后台线程上调用方法run
。然后您使用其方法run
创建一个新的runnable。匿名runnable的run
无论何时hanlder.post
决定运行它,都将调用它。在Android上,处理程序将在UI线程上运行它。