Java 跨异步调用流执行/逻辑上下文

Java 跨异步调用流执行/逻辑上下文,java,android,Java,Android,Android(Java)中是否有类似于.NET的保留逻辑上下文的机制?逻辑上下文指的是一旦保留的信息,以后可以在整个逻辑执行线程中访问,这意味着它将在异步调用中幸存。例如: handler = new Handler(); final Runnable r = new Runnable() { public void run() { System.out.print(LogicalContext.get("foo")); //should print "bar"

Android(Java)中是否有类似于.NET的保留逻辑上下文的机制?逻辑上下文指的是一旦保留的信息,以后可以在整个逻辑执行线程中访问,这意味着它将在异步调用中幸存。例如:

handler = new Handler();

final Runnable r = new Runnable() {
    public void run() {
        System.out.print(LogicalContext.get("foo")); //should print "bar" 
    }
};

LogicalContext.set("foo", "bar");
handler.postDelayed(r, 1000);
为了澄清,我知道闭包。然而,我需要的是一个自动机制,它不需要我每次都捕获我想要传递的上下文。为了进一步澄清,仅仅一个静态字段也不行,因为我希望不同的逻辑执行线程具有不同的上下文(这将在调用
LogicalContext.set
时开始,并通过从那时起进行的任何异步调用[基本上通过复制]流动)

在C#中,它看起来是这样的:

CallContext.LogicalSetData("foo", "bar");
await Task.Run(() => Console.WriteLine(CallContext.LogicalGetData("foo")));

如果这是不可能的,我会满足于这种机制的一种特殊情况——确定当前的逻辑流/执行线程是否源自
IntentService

您可以使用
InheritableThreadLocal
,它类似于.NET的
AsyncLocal

Handler=newhandler();
final InheritableThreadLocal foo=新的InheritableThreadLocal();
最终可运行r=新可运行(){
公开募捐{
System.out.print(foo.get());//打印“Bar”
}
};
foo.set(“Bar”);
后延迟(r,1);

与:)正好相反。需要注意的是,它并不完全等同于.NET的执行上下文。它仅在创建线程时适用,因此当将工作委托给现有线程(例如,main/UI循环器)时,上下文不会流动。这与.NET的执行上下文相反,在.NET的执行上下文中,
CallContext.LogicalSetData
即使在使用类似于
SynchronizationContext.Post的东西时也会流动(在WPF等UI框架中,它通常会将委托发布到现有[UI]线程)。
Handler handler = new Handler();
final InheritableThreadLocal<String> foo = new InheritableThreadLocal<String>();

final Runnable r = new Runnable() {
    public void run() {
         System.out.print(foo.get()); // prints "Bar"
    }
};

foo.set("Bar");
handler.postDelayed(r, 1);