# Observable

Published articles for Observable.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Building observable AI agents: Temporal now integrates with Braintrust

DevFeed: [Building observable AI agents: Temporal now integrates with Braintrust](<https://devfeed.tech/articles/building-observable-ai-agents-temporal-now-integrates-with-braintrust-35747.md>)

Original publisher: [Read original article](<https://temporal.io/blog/building-observable-ai-agents-temporal-now-integrates-with-braintrust>)

Author: Ornella Altunyan

Published: 2026-01-20T00:00:00Z

Content type: release

Language: en

Sources: [Temporal Blog](<https://devfeed.tech/sources/temporal-blog.md>)

Topics: [agent observability](<https://devfeed.tech/topics/agent-observability.md>), [ai observability](<https://devfeed.tech/topics/ai-observability.md>), [tracing](<https://devfeed.tech/topics/tracing.md>), [prompt](<https://devfeed.tech/topics/prompt.md>), [Large Language Model](<https://devfeed.tech/topics/llm.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>)

Tags: [agents](<https://devfeed.tech/tags/agents.md>), [ai](<https://devfeed.tech/tags/ai.md>), [ai-agents](<https://devfeed.tech/tags/ai-agents.md>), [announce](<https://devfeed.tech/tags/announce.md>), [announcements](<https://devfeed.tech/tags/announcements.md>), [evals](<https://devfeed.tech/tags/evals.md>), [execution](<https://devfeed.tech/tags/execution.md>), [integration](<https://devfeed.tech/tags/integration.md>), [latency](<https://devfeed.tech/tags/latency.md>), [llm](<https://devfeed.tech/tags/llm.md>), [observable](<https://devfeed.tech/tags/observable.md>), [release](<https://devfeed.tech/tags/release.md>), [temporal](<https://devfeed.tech/tags/temporal.md>), [tracing](<https://devfeed.tech/tags/tracing.md>), [versioning](<https://devfeed.tech/tags/versioning.md>)

### AI overview

Temporal announces an integration with Braintrust that combines Temporal's durable workflow execution with Braintrust's LLM observability. The integration is intended to help teams monitor and debug AI agents in production using tracing, prompt versioning, evaluations, and cost and latency metrics.

### Source excerpt

Build observable AI agents with Temporal's new Braintrust integration -- combine durable workflow execution with LLM tracing, prompt versioning, evals, and cost/latency metrics so you can ship reliable, debuggable agents in production.

## Building Reactive UIs with LiveData and SavedStateHandle (or equivalent approaches)

DevFeed: [Building Reactive UIs with LiveData and SavedStateHandle (or equivalent approaches)](<https://devfeed.tech/articles/building-reactive-uis-with-livedata-and-savedstatehandle-or-equivalent-approaches-25928.md>)

Original publisher: [Read original article](<https://itnext.io/building-reactive-uis-with-livedata-and-savedstatehandle-or-equivalent-approaches-4e934487035f?source=rss-7a8d96da8cb6------2>)

Author: Gabor Varadi

Published: 2020-10-04T19:53:05Z

Content type: tutorial

Language: en

Sources: [Stories by Gabor Varadi on Medium](<https://devfeed.tech/sources/stories-by-gabor-varadi-on-medium.md>)

Topics: [reactive](<https://devfeed.tech/topics/reactive.md>), [Android](<https://devfeed.tech/topics/android.md>), [Jetpack](<https://devfeed.tech/topics/jetpack.md>), [RxJava](<https://devfeed.tech/topics/rxjava.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [coroutine](<https://devfeed.tech/tags/coroutine.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [lifecycle](<https://devfeed.tech/tags/lifecycle.md>), [livedata](<https://devfeed.tech/tags/livedata.md>), [observable](<https://devfeed.tech/tags/observable.md>), [reactive](<https://devfeed.tech/tags/reactive.md>), [reactive-programming](<https://devfeed.tech/tags/reactive-programming.md>), [room](<https://devfeed.tech/tags/room.md>), [rxjava](<https://devfeed.tech/tags/rxjava.md>), [savedstatehandle](<https://devfeed.tech/tags/savedstatehandle.md>)

### AI overview

This article explains LiveData as a reactive, observable, lifecycle-aware data holder for Android applications. It argues that LiveData remains useful alongside RxJava and Kotlin coroutines because its lifecycle activation states allow it to represent reactive data sources, including Room-backed data that refreshes after invalidation.

### Source excerpt

Building Reactive UIs with LiveData and SavedStateHandle (or equivalent approaches like Rx) You can also follow the related discussion thread on /r/android_devs. LiveData is a misunderstood beast. Every so often, you see comments like "LiveData does not belong in Repositories", or that with the existence of RxJava, Coroutine Channels, or Coroutine Flows -- there's "no reason to use LiveData at all". While there are components in these libraries that have overlapping responsibilities (BehaviorRelay, ConflatedBroadcastChannel, MutableStateFlow), that doesn't mean LiveData is useless. With the relatively new additions to Jetpack, such as the liveData { coroutine builder, LiveData is actually quite interesting. What is LiveData? If you try to find a definition for LiveData, you'll find that it's a "reactive, observable, lifecycle-aware data holder". We know it can be observed, and we know it holds 1 data value that is re-emitted for any new observer (and any changes made to it are also emitted), just like any BehaviorRelay. But what makes it special? Due to LiveData's lifecycle-awareness, it comes with its own "activation state" ( onActive and onInactive). It lets you know when there is an active observer, and when there are no longer any active observers. The trick is that this makes it far more than "just an every-day data holder". This allows LiveData to represent reactive datasources. I'd even wager that this is the original purpose for which LiveData was created, if Room's ComputableLiveData is any indication (as that also relies on onActive to trigger the refresh of the query results, if the table had been invalidated by a write to it). Why do I want reactive datasources? If you have data or state that can change over time, it's significantly easier to be notified of changes, than it is to poll for possible changes (and potentially miss out on changes if we tried to fetch data at the wrong time). This means that by using an "observer" (or change listener), we can r

## RxJava Observable to Single

DevFeed: [RxJava Observable to Single](<https://devfeed.tech/articles/rxjava-observable-to-single-38612.md>)

Original publisher: [Read original article](<https://krossovochkin.com/posts/2019_05_27_rxjava_observable_to_single/>)

Published: 2019-05-27T00:00:00Z

Content type: tutorial

Language: en

Sources: [Vasya Drobushkov](<https://devfeed.tech/sources/vasya-drobushkov.md>)

Topics: [RxJava](<https://devfeed.tech/topics/rxjava.md>), [implementation](<https://devfeed.tech/topics/implementation.md>)

Tags: [implementation](<https://devfeed.tech/tags/implementation.md>), [observable](<https://devfeed.tech/tags/observable.md>), [rxjava](<https://devfeed.tech/tags/rxjava.md>), [stream](<https://devfeed.tech/tags/stream.md>)

### AI overview

This tutorial explains how to transform RxJava Observable instances into Single instances. It compares operators such as single, singleOrError, Single.fromObservable, elementAt, and first, and describes how their underlying strategy handles emitted values, completion, and errors.

### Source excerpt

Transforming Single to Observable is simple, as Single satisfies Observable's contract. Just call single.toObservable() and you're good. But transforming Observable to Single is not that simple: if it happens that Observable emits exactly one value and completes (or terminates with error without emitting values) then it is pretty straightforward, otherwise one need to set up some additional rules. In RxJava there are a number of operators for transforming Observable to Single:

## RxJava's Side Effect Methods

DevFeed: [RxJava's Side Effect Methods](<https://devfeed.tech/articles/rxjava-s-side-effect-methods-29121.md>)

Original publisher: [Read original article](<https://www.grokkingandroid.com/rxjavas-side-effect-methods/>)

Author: Wolfram Rittmeyer

Published: 2015-11-10T08:40:16Z

Content type: tutorial

Language: en

Sources: [Grokking Android](<https://devfeed.tech/sources/grokking-android.md>)

Topics: [RxJava](<https://devfeed.tech/topics/rxjava.md>), [debug](<https://devfeed.tech/topics/debug.md>), [Error Handling](<https://devfeed.tech/topics/error-handling.md>), [Cache](<https://devfeed.tech/topics/cache.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [cache](<https://devfeed.tech/tags/cache.md>), [debugging](<https://devfeed.tech/tags/debugging.md>), [dooncompleted](<https://devfeed.tech/tags/dooncompleted.md>), [dooneach](<https://devfeed.tech/tags/dooneach.md>), [doonerror](<https://devfeed.tech/tags/doonerror.md>), [doonnext](<https://devfeed.tech/tags/doonnext.md>), [doonsubscribe](<https://devfeed.tech/tags/doonsubscribe.md>), [error-handling](<https://devfeed.tech/tags/error-handling.md>), [observable](<https://devfeed.tech/tags/observable.md>), [rxjava](<https://devfeed.tech/tags/rxjava.md>)

### AI overview

This tutorial explains RxJava side-effect methods on Observable. These methods react to events without changing the emitted items, and can be used for debugging, error handling, and saving or caching network results.

### Source excerpt

RxJava's Observable class has plenty of methods that can be used to transform the stream of emitted items to the kind of data that you need. Those methods are at the very core of RxJava and form a big part of it's attraction. But there are other methods, that do not change the stream of [...] Continue Reading "RxJava's Side Effect Methods" The post RxJava's Side Effect Methods appeared first on Grokking Android.

## Why use Observable.create() and not just inherit from Observable?

DevFeed: [Why use Observable.create() and not just inherit from Observable?](<https://devfeed.tech/articles/why-use-observable-create-and-not-just-inherit-from-observable-29128.md>)

Original publisher: [Read original article](<https://www.grokkingandroid.com/why-use-observable-create-and-not-just-inherit-from-observable/>)

Author: Wolfram Rittmeyer

Published: 2015-10-09T05:00:40Z

Content type: tutorial

Language: en

Sources: [Grokking Android](<https://devfeed.tech/sources/grokking-android.md>)

Topics: [RxJava](<https://devfeed.tech/topics/rxjava.md>), [Inheritance](<https://devfeed.tech/topics/inheritance.md>), [hooks](<https://devfeed.tech/topics/hooks.md>), [debug](<https://devfeed.tech/topics/debug.md>), [Monitoring](<https://devfeed.tech/topics/monitoring.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [create](<https://devfeed.tech/tags/create.md>), [debug](<https://devfeed.tech/tags/debug.md>), [hooks](<https://devfeed.tech/tags/hooks.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [inheritance](<https://devfeed.tech/tags/inheritance.md>), [monitoring](<https://devfeed.tech/tags/monitoring.md>), [observable](<https://devfeed.tech/tags/observable.md>), [rxjava](<https://devfeed.tech/tags/rxjava.md>)

### AI overview

This tutorial explains why RxJava developers should generally create Observables with Observable.create() instead of inheriting from Observable. It discusses final methods, the fluent API, and hooks that support debugging and monitoring, while noting that inheritance can still be appropriate in cases such as Subject.

### Source excerpt

When starting to use RxJava you have to create Observables. They are at the very core of RxJava. But how to do so? A look at the Observable class might make you dizzy. Looking at the source even more so. Not only does this beast consist of nearly 10.000 lines (though, 7600 lines of that [...] Continue Reading "Why use Observable.create() and not just inherit from Observable?" The post Why use Observable.create() and not just inherit from Observable? appeared first on Grokking Android.

## Implementing an Event Bus With RxJava - RxBus

DevFeed: [Implementing an Event Bus With RxJava - RxBus](<https://devfeed.tech/articles/implementing-an-event-bus-with-rxjava-rxbus-25264.md>)

Original publisher: [Read original article](<https://kau.sh/blog/implementing-an-event-bus-with-rxjava-rxbus/>)

Author: Kaushik Gopal

Published: 2014-12-24T07:00:00Z

Content type: tutorial

Language: en

Sources: [Kaushik Gopal's Site](<https://devfeed.tech/sources/kaushik-gopal-s-site.md>)

Topics: [RxJava](<https://devfeed.tech/topics/rxjava.md>), [Development](<https://devfeed.tech/topics/development.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [Android](<https://devfeed.tech/topics/android.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [code](<https://devfeed.tech/tags/code.md>), [decoupling](<https://devfeed.tech/tags/decoupling.md>), [dependencies](<https://devfeed.tech/tags/dependencies.md>), [events](<https://devfeed.tech/tags/events.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [observable](<https://devfeed.tech/tags/observable.md>), [rxjava](<https://devfeed.tech/tags/rxjava.md>)

### AI overview

A three-part tutorial that explains event buses through the Observer and publish-subscribe patterns, then describes implementing an event bus with RxJava for Android. It presents RxBus as a simple approach rather than a standalone library.

### Source excerpt

This post has three parts: quick primer on what an event bus is implementing the event bus with RxJava parting thoughts on this approach "RxBus" is not going to be a library. Implementing an event bus with RxJava is so ridiculously easy that it doesn't warrant the bloat of an independent library. Part 1: What is an event bus? # Let's talk about two concepts that seem similar: the Observer pattern and the Pub-sub pattern. Observer pattern ## This is a pattern of development in which your class or primary object (known as the Observable) notifies other interested classes or objects (known as Observers) with relevant information (events). Pub-sub pattern ## The objective of the pub-sub pattern is exactly the same as the Observer pattern viz. you want some other class to know of certain events taking place. There's an important semantic difference between the Observer and Pub-sub patterns though: in the pub-sub pattern the focus is on "broadcasting" messages outside. The Observable here doesn't want to know who the events are going out to, just that they've gone out. In other words the Observable (a.k.a Publisher) doesn't want to know who the Observers (a.k.a Subscribers) are. Why the anonymity? ## It allows for this thing called "decoupling", which is a good word in computer programming. You want to keep coupling as low as possible in your design. Typically, you would expect the publisher to have direct knowledge of each of the many subscribers that it needs to notify, so it can go about notifying each of them, once the "event" or message is ready. But with an event bus, the publisher is relieved of such duties and this independence helps, because the publisher and subscriber need not have logic coded in them that establish the dependencies between the two. In other words "consciously decouple" your code whenever you can*. How the anonymity? ## Ok, so a natural question with the pub-sub pattern is: how do you actually achieve that anonymity between publisher and subscr

## Async sequential workflows

DevFeed: [Async sequential workflows](<https://devfeed.tech/articles/async-sequential-workflows-38412.md>)

Original publisher: [Read original article](<https://khmylov.com/2012/04/async-sequential-workflows/>)

Author: Andrew Khmylov

Published: 2012-04-26T00:00:00Z

Content type: tutorial

Language: ru

Sources: [Despite the odds](<https://devfeed.tech/sources/despite-the-odds.md>)

Topics: [async](<https://devfeed.tech/topics/async.md>), [async/await](<https://devfeed.tech/topics/async-await.md>), [client](<https://devfeed.tech/topics/client.md>), [.NET](<https://devfeed.tech/topics/net.md>)

Tags: [async](<https://devfeed.tech/tags/async.md>), [await](<https://devfeed.tech/tags/await.md>), [client](<https://devfeed.tech/tags/client.md>), [concurrent](<https://devfeed.tech/tags/concurrent.md>), [foreach](<https://devfeed.tech/tags/foreach.md>), [observable](<https://devfeed.tech/tags/observable.md>), [request](<https://devfeed.tech/tags/request.md>), [yield](<https://devfeed.tech/tags/yield.md>)

### AI overview

This tutorial compares synchronous and asynchronous implementations of sequential workflows for downloading files with .NET WebClient. It explains how sequential requests can be represented with observables and how async/await can reduce the work needed to describe the control flow.

### Source excerpt

В последнее время всё чаще приходится сталкиваться с задачами, требующими выполнения последовательных асинхронных операций. Примером может служить загрузка файлов на мобильном устройстве. Учитывая что телефон может работать на слабом мобильном соединении, нам вряд ли удастся получить прирост производительности от параллельной загрузки. Да и стандартный класс WebClient, представленный в BCL не очень дружит с concurrent operations (точнее вообще не дружит). Создавать новый экземпляр на каждый запрос кажется идейно неправильным, так что попробуем обойтись одним веб-клиентом, обрабатывающим множество последовательных запросов. Для начала - тривиальная синхронная реализация (которая конечно же не будет работать на WP7 из-за отсутствия синхронных методов у WebClient'а): public IEnumerable<string> Handle(IEnumerable<Uri> requests) { var client = new WebClient(); foreach (var request in requests) { yield return client.DownloadString(request); } } Разработчику, использующему асинхронную версии, скорее всего захочется узнать о моменте завершении загрузок. Не будем плохими мальчиками/девочками и отбросим мысли о EAP и ручном CPS. Довольно очевидным решением будет представить наши ожидающие загрузки файлы в виде потока событий при помощи observables. К сожалению, WebClient использует EAP для своих асинхронных операций, поэтому код становится чуть более неопрятным: public IObservable<string> HandleAsync(IList<Uri> requests) { var client = new WebClient(); var subject = new Subject<string>(); var enumerator = requests.GetEnumerator(); Action takeNext = () => { if (enumerator.MoveNext()) { client.DownloadStringAsync(enumerator.Current); } else { subject.OnCompleted(); } }; client.DownloadStringCompleted += (s, e) => { if (e.Error != null) { subject.OnError(e.Error); } else { subject.OnNext(e.Result); takeNext(); } }; takeNext(); return subject; } В обоих случаях мы по сути описываем корутины, передающие управление в момент окончания обработки запроса. В синхронной реализации компи