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

时间:2016-07-14 16:19:58

标签: java android

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 个答案:

答案 0 :(得分: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);