Java 使用方法创建可运行类,该方法使用对UI主线程执行后的回调

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

我有一个问题,这个代码是否正确。我怀疑Runnable类中的后台执行是在run()方法中执行,还是也在构造函数中执行。。。很明显,它正在运行(),但我想确保我的想法

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线程上运行它。