2016-07-14 8 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

あなたは.NETのAsyncLocal<T>に似ている、InheritableThreadLocal<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

Nice find !!!!!! –

+0

.NETの実行コンテキストと完全に同等ではありませんが、注意することが重要です。スレッドが*作成されているときにのみ適用される*ので、既存のスレッド(例えば、メイン/ UIルーパ)に作業を委譲するとき、コンテキストは流れません。これは、 'SynchronizationContext.Post'(WPFなどのUIフレームワークでは通常、既存の[UI]スレッドにデリゲートをポストする)のようなものを使用しても' CallContext.LogicalSetData'が流れる.NETの実行コンテキストとは対照的です。 –

関連する問題