2016-07-14 30 views
1

Android(Java)中是否存在保留逻辑上下文的机制,类似于.NET的ExecutionContext?通过逻辑上下文,我的意思是一旦保留了信息,以后就可以在整个执行线程中访问,这意味着它可以在异步调用中存活下来。例如:跨异步调用的流执行/逻辑上下文

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

+1

完全http://stackoverflow.com/questions/5754281/inheritable-thread-local-in-net :)相反 –

回答

1

您可以使用InheritableThreadLocal<T>,这类似于.NET的AsyncLocal<T>

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); 
+0

不错的发现!!!!!! –

+0

尽管它不完全等同于.NET的执行上下文,但需要注意一点。它仅适用于创建线程时*,因此在将工作委派给现有线程(例如主/ UI looper)时,上下文不会流动。这与.NET的执行上下文形成了鲜明对比,即使使用诸如'SynchronizationContext.Post'之类的'CallContext.LogicalSetData'(在UI框架中,例如WPF通常会将代理发布到现有的[UI]线程中),'CallContext.LogicalSetData'也会流动。 –