SlideShare ist ein Scribd-Unternehmen logo
1 von 56
Downloaden Sie, um offline zu lesen
Asynchronous
Programming in
Android
1
About Me
Consultant at Manifest Solutions Android developer since Froyo (v2.2)
2
Example Application
https://github.com/pendext/asynchronicity
3
4
What does asynchronous mean in the context of
Android?
UI Thread? Main Thread?
5
Android Threading
6
Android creates a thread called “main” (often referred
to as the UI thread) for each application when it starts. 

Source: http://developer.android.com/guide/components/processes-
and-threads.html#Threads
Android Threading
The Android operating system does not create a
separate thread for each instance of a component

Methods that respond to system callbacks (e.g.
key and touch events) always run on the UI thread
6
Android creates a thread called “main” (often referred
to as the UI thread) for each application when it starts. 

Source: http://developer.android.com/guide/components/processes-
and-threads.html#Threads
Android Threading Rules
7
The Android developer guidelines has 2 rules for dealing with threads on the
Android platform
1. Do not block the UI thread
2. Do not access the Android UI toolkit (e.g. android.View and
android.Widget) from outside the UI thread
Source: http://developer.android.com/guide/components/processes-
and-threads.html#Threads
The dreaded ANR
(application not responding)
The Application Not Responding event occurs when an app is in a state
where it cannot receive user input.
8
The dreaded ANR
(application not responding)
The Application Not Responding event occurs when an app is in a state
where it cannot receive user input.
8
The dreaded ANR
(application not responding)
The Application Not Responding event occurs when an app is in a state
where it cannot receive user input.
8
The dreaded ANR
(application not responding)
The Application Not Responding event occurs when an app is in a state
where it cannot receive user input.
8
Application Not Responding criteria
No response to an input event (such as key press or screen touch events) within 5 seconds
A BroadcastReceiver hasn't finished executing within 10 seconds
Source: http://developer.android.com/training/articles/perf-anr.html
Application Performance
Better User Experience
Asynchronous code has a precedence in the world of browsers
Why Asynchronously?
9
Application Performance
Better User Experience
Asynchronous code has a precedence in the world of browsers
Why Asynchronously?
9
Network calls
Queries against a local SQLite database
Anything computationally intensive
Background tasks/services/jobs
What Asynchronously?
10
Asynchronous in the Android SDK
11
Thread & Runnable.run()
Very low level
Does not have access to the UI thread, requiring usage of one of the following
methods of accessing the UI thread
12
Activity.runOnUiThread(Runnable runnable)
View.post(Runnable runnable)
View.postDelayed(Runnable runnable, long delay)
Handler
Basic Runnable.run() Usage
13
Basic Runnable.run() Usage
13
Basic Runnable.run() Usage
13
Basic Runnable.run() Usage
13
Basic Runnable.run() Usage
13
Downsides of Runnable
Can be complex
Tightly couples the long running event to an Activity or Fragment
Unnecessary in most use cases
14
android.os.AsyncTask
AsyncTask is recommended for short running operations, i.e. seconds not minutes
AsyncTask is an abstract class that has three generic type parameters, Params,
Progress, and Result
AsyncTask excels for RESTful calls, SQLite writes, shorter one off tasks
15
AsyncTask methods/callbacks
onPreExecute() - Invoked on the UI thread before the task is executed. Any setup
should go here
doInBackground(Params…) - Invoked off of the UI thread. The work should go here
onProgressUpdate(Progress…) - Invoked on the UI thread. Any display of progress
to the user should go here
onPostExecute(Result) - Invoked on the UI thread after doInBackground() returns.
The result of doInBackground() is passed into this method as a parameter
16
AsyncTask usage
execute() must be invoked on the UI thread
Do not call any of the previous methods/callbacks directly
The task can be executed only once
17
From within an Activity or Fragment
Downsides of AsyncTask
Tightly couples the asynchronous work to an Activity or Fragment and the
activity life cycle
Should only be used for shorter asynchronous work
Canceling an AsyncTask still completes the work in doInBackground(), forcing
the invoker of the AsyncTask to handle canceled requests that actually complete
18
android.content.Loader
Loaders are available to any Activity or Fragment
Loaders monitor the source of the data and and update the results when the data
changes
Loaders are good for accessing changing data within a SQLite database or from
within a Content Provider
19
android.content.Loader
Important classes:
LoaderManager - managers loaders in the context of the Android Activity Lifecycle
LoaderManager.LoaderCallbacks - Interface that must be implemented, contains
methods that allow the UI to be updated when the data changes
20
21
22
android.app.Service
Services in Android function very much like an Activity without a UI component,
including a lifecycle similar to the Android Activity lifecycle
Services do not have to be bound to an Activity
Services will run indefinitely even if the component they are called from is destroyed
Services run on whichever thread they are called from so to run off of the UI thread,
they must be invoked from a separate Thread, or should do any long running work
in the service on a separate Thread
23
android.app.Service
Services are good for tasks that will be continuously running on a device and updating
the user or completing some task regardless of the state of the application
e.g.
A cloud based file storage application that syncs new photos automatically to the
cloud as they are taken
Usage is as simple as calling startService() from within an Activity and passing
this method an Intent with the desired Service
24
Open Source Asynchronicity
25
Priority Job Queue
https://github.com/yigit/android-priority-jobqueue
The priority job queue provides a framework to define tasks that run off of the UI
thread
Prioritization
Persistance
Delaying
Network control
26
Priority Job Queue Usage
27
Priority Job Queue Usage
From with an Activity or Fragment
28
Event Bus
29
Event Bus
29
AsynchronousJob extends Job {}
Event Bus
29
AsynchronousJob extends Job {}
When onRun() completes, send
event
Event Bus
29
AsynchronousJob extends Job {}
When onRun() completes, send
event
Subscribers are usually
Activity or Fragment
classes that utilize a
callback method to
receive the event and
act upon it
Event Bus Implementations
30
https://github.com/greenrobot/EventBus

http://square.github.io/otto/

Both implementations work similarly - they
provide a mechanism for sending events
and a callback mechanism
RxJava
ReactiveX is a library for composing asynchronous and event-based programs by using
observable sequences
Source: http://reactivex.io/
31
32
Source: http://reactivex.io/documentation/observable.html
32
What does that mean?
Source: http://reactivex.io/documentation/observable.html
32
Source: http://reactivex.io/documentation/observable.html
32
Source: http://reactivex.io/documentation/observable.html
33
34
RxJava Android Module
Provides Android specific bindings for RxJava, which include wrappers around
Android’s Handler class as well as operators that are specific to the android Activity
and Fragment lifecycle
Source: https://github.com/ReactiveX/RxJava/wiki/The-RxJava-Android-Module
35
Monitoring the UI Thread
36
Easy UI Thread Monitoring
Developer Options on device - Strict mode enabled
Device wide
Minimal amount of control
Strict mode in your application itself, programmatically
At the Activity or Fragment level
Large amount of control
Varying levels of effects when rules are violated
37
Easy UI Thread Monitoring
38
Easy UI Thread Monitoring
39
If nothing else remember…
1. Do not block the UI thread
2. Do not access the Android UI toolkit (e.g. android.View and android.Widget)
from outside the UI thread
40
Source: http://developer.android.com/guide/components/
processes-and-threads.html#Threads
41
Questions
?
jpendexter@manifestcorp.com

Weitere ähnliche Inhalte

Was ist angesagt?

Introduction to the Java(TM) Advanced Imaging API
Introduction to the Java(TM) Advanced Imaging APIIntroduction to the Java(TM) Advanced Imaging API
Introduction to the Java(TM) Advanced Imaging API
white paper
 
Gerência de Configuração com Maven
Gerência de Configuração com MavenGerência de Configuração com Maven
Gerência de Configuração com Maven
elliando dias
 
谷歌 Scott-lessons learned in testability
谷歌 Scott-lessons learned in testability谷歌 Scott-lessons learned in testability
谷歌 Scott-lessons learned in testability
drewz lin
 

Was ist angesagt? (20)

Inside the Android application framework - Google I/O 2009
Inside the Android application framework - Google I/O 2009Inside the Android application framework - Google I/O 2009
Inside the Android application framework - Google I/O 2009
 
Process Matters (Cloud2Days / Java2Days conference))
Process Matters (Cloud2Days / Java2Days conference))Process Matters (Cloud2Days / Java2Days conference))
Process Matters (Cloud2Days / Java2Days conference))
 
Qtp Interview Questions
Qtp Interview QuestionsQtp Interview Questions
Qtp Interview Questions
 
Introduction to jython
Introduction to jythonIntroduction to jython
Introduction to jython
 
Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1
 
What is Java? Presentation On Introduction To Core Java By PSK Technologies
What is Java? Presentation On Introduction To Core Java By PSK TechnologiesWhat is Java? Presentation On Introduction To Core Java By PSK Technologies
What is Java? Presentation On Introduction To Core Java By PSK Technologies
 
Qtp interview questions and answers
Qtp interview questions and answersQtp interview questions and answers
Qtp interview questions and answers
 
Java Performance Tuning
Java Performance TuningJava Performance Tuning
Java Performance Tuning
 
Python Raster Function - Esri Developer Conference - 2015
Python Raster Function - Esri Developer Conference - 2015Python Raster Function - Esri Developer Conference - 2015
Python Raster Function - Esri Developer Conference - 2015
 
Introduction to the Java(TM) Advanced Imaging API
Introduction to the Java(TM) Advanced Imaging APIIntroduction to the Java(TM) Advanced Imaging API
Introduction to the Java(TM) Advanced Imaging API
 
Gerência de Configuração com Maven
Gerência de Configuração com MavenGerência de Configuração com Maven
Gerência de Configuração com Maven
 
Java interview question
Java interview questionJava interview question
Java interview question
 
Multithreading in Android
Multithreading in AndroidMultithreading in Android
Multithreading in Android
 
ObjectLayout: Closing the (last?) inherent C vs. Java speed gap
ObjectLayout: Closing the (last?) inherent C vs. Java speed gapObjectLayout: Closing the (last?) inherent C vs. Java speed gap
ObjectLayout: Closing the (last?) inherent C vs. Java speed gap
 
Core Java introduction | Basics | free course
Core Java introduction | Basics | free course Core Java introduction | Basics | free course
Core Java introduction | Basics | free course
 
谷歌 Scott-lessons learned in testability
谷歌 Scott-lessons learned in testability谷歌 Scott-lessons learned in testability
谷歌 Scott-lessons learned in testability
 
Apache Deltaspike the CDI Toolbox (Java One 2015)
Apache Deltaspike the CDI Toolbox (Java One 2015)Apache Deltaspike the CDI Toolbox (Java One 2015)
Apache Deltaspike the CDI Toolbox (Java One 2015)
 
Networking
NetworkingNetworking
Networking
 
Project Reactor Now and Tomorrow
Project Reactor Now and TomorrowProject Reactor Now and Tomorrow
Project Reactor Now and Tomorrow
 
MicroProfile: A Quest for a Lightweight and Modern Enterprise Java Platform
MicroProfile: A Quest for a Lightweight and Modern Enterprise Java PlatformMicroProfile: A Quest for a Lightweight and Modern Enterprise Java Platform
MicroProfile: A Quest for a Lightweight and Modern Enterprise Java Platform
 

Andere mochten auch

Memory problems in android programming
Memory problems in android programmingMemory problems in android programming
Memory problems in android programming
AiTi Education
 
Advance Android Programming - learning beyond basics
Advance Android Programming - learning beyond basicsAdvance Android Programming - learning beyond basics
Advance Android Programming - learning beyond basics
ayman diab
 
Tips and tricks to attack memory problem in android programming
Tips and tricks to attack memory problem in android programmingTips and tricks to attack memory problem in android programming
Tips and tricks to attack memory problem in android programming
Zalo_app
 
Stream upload and asynchronous job processing in large scale systems
Stream upload and asynchronous job processing  in large scale systemsStream upload and asynchronous job processing  in large scale systems
Stream upload and asynchronous job processing in large scale systems
Zalo_app
 

Andere mochten auch (20)

Memory problems in android programming
Memory problems in android programmingMemory problems in android programming
Memory problems in android programming
 
Advance Android Programming - learning beyond basics
Advance Android Programming - learning beyond basicsAdvance Android Programming - learning beyond basics
Advance Android Programming - learning beyond basics
 
Non Conventional Android Programming (English)
Non Conventional Android Programming (English)Non Conventional Android Programming (English)
Non Conventional Android Programming (English)
 
Advance Android application development workshop day 1
Advance Android application development workshop day 1Advance Android application development workshop day 1
Advance Android application development workshop day 1
 
Software proposal on android
Software proposal on androidSoftware proposal on android
Software proposal on android
 
Android Workshop 2013
Android Workshop 2013Android Workshop 2013
Android Workshop 2013
 
Android UI Reference
Android UI ReferenceAndroid UI Reference
Android UI Reference
 
Advance Android application development workshop day 3
Advance Android application development workshop day 3Advance Android application development workshop day 3
Advance Android application development workshop day 3
 
Web Development Fundamentals
Web Development FundamentalsWeb Development Fundamentals
Web Development Fundamentals
 
Tips and tricks to attack memory problem in android programming
Tips and tricks to attack memory problem in android programmingTips and tricks to attack memory problem in android programming
Tips and tricks to attack memory problem in android programming
 
Stream upload and asynchronous job processing in large scale systems
Stream upload and asynchronous job processing  in large scale systemsStream upload and asynchronous job processing  in large scale systems
Stream upload and asynchronous job processing in large scale systems
 
Advance Android Application Development
Advance Android Application DevelopmentAdvance Android Application Development
Advance Android Application Development
 
Coding defines reality
Coding defines realityCoding defines reality
Coding defines reality
 
Android Protips: Advanced Topics for Expert Android App Developers
Android Protips: Advanced Topics for Expert Android App DevelopersAndroid Protips: Advanced Topics for Expert Android App Developers
Android Protips: Advanced Topics for Expert Android App Developers
 
Advance Android Layout Walkthrough
Advance Android Layout WalkthroughAdvance Android Layout Walkthrough
Advance Android Layout Walkthrough
 
Android Programming
Android ProgrammingAndroid Programming
Android Programming
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on Android
 
Android app development - Java Programming for Android
Android app development - Java Programming for AndroidAndroid app development - Java Programming for Android
Android app development - Java Programming for Android
 
Reactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJavaReactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJava
 
Sto L Pa N@Nfc Academy 2009
Sto L Pa N@Nfc Academy 2009Sto L Pa N@Nfc Academy 2009
Sto L Pa N@Nfc Academy 2009
 

Ähnlich wie Asynchronous Programming in Android

Threads handlers and async task, widgets - day8
Threads   handlers and async task, widgets - day8Threads   handlers and async task, widgets - day8
Threads handlers and async task, widgets - day8
Utkarsh Mankad
 
Data Transfer between Activities & Databases
Data Transfer between Activities & DatabasesData Transfer between Activities & Databases
Data Transfer between Activities & Databases
Muhammad Sajid
 
Android basic principles
Android basic principlesAndroid basic principles
Android basic principles
Henk Laracker
 

Ähnlich wie Asynchronous Programming in Android (20)

Threads handlers and async task, widgets - day8
Threads   handlers and async task, widgets - day8Threads   handlers and async task, widgets - day8
Threads handlers and async task, widgets - day8
 
[Android] Multiple Background Threads
[Android] Multiple Background Threads[Android] Multiple Background Threads
[Android] Multiple Background Threads
 
Android101
Android101Android101
Android101
 
Think Async: Understanding the Complexity of Multithreading - Avi Kabizon & A...
Think Async: Understanding the Complexity of Multithreading - Avi Kabizon & A...Think Async: Understanding the Complexity of Multithreading - Avi Kabizon & A...
Think Async: Understanding the Complexity of Multithreading - Avi Kabizon & A...
 
Android - Background operation
Android - Background operationAndroid - Background operation
Android - Background operation
 
Data Transfer between Activities & Databases
Data Transfer between Activities & DatabasesData Transfer between Activities & Databases
Data Transfer between Activities & Databases
 
Improving app performance with Kotlin Coroutines
Improving app performance with Kotlin CoroutinesImproving app performance with Kotlin Coroutines
Improving app performance with Kotlin Coroutines
 
Explore Android Internals
Explore Android InternalsExplore Android Internals
Explore Android Internals
 
Android Whats running in background
Android Whats running in backgroundAndroid Whats running in background
Android Whats running in background
 
Asp.net+interview+questions+and+answers
Asp.net+interview+questions+and+answersAsp.net+interview+questions+and+answers
Asp.net+interview+questions+and+answers
 
Android
AndroidAndroid
Android
 
Angular performance slides
Angular performance slidesAngular performance slides
Angular performance slides
 
Case study on Movie Quiz App For IPhone and IPad – Facebook Enabled
Case study on Movie Quiz App For IPhone and IPad –  Facebook Enabled Case study on Movie Quiz App For IPhone and IPad –  Facebook Enabled
Case study on Movie Quiz App For IPhone and IPad – Facebook Enabled
 
Android application development
Android application developmentAndroid application development
Android application development
 
Web services, WCF services and Multi Threading with Windows Forms
Web services, WCF services and Multi Threading with Windows FormsWeb services, WCF services and Multi Threading with Windows Forms
Web services, WCF services and Multi Threading with Windows Forms
 
Android Connecting to internet Part 2
Android  Connecting to internet Part 2Android  Connecting to internet Part 2
Android Connecting to internet Part 2
 
Android basic principles
Android basic principlesAndroid basic principles
Android basic principles
 
Andriod Lecture 8 A.pptx
Andriod Lecture 8 A.pptxAndriod Lecture 8 A.pptx
Andriod Lecture 8 A.pptx
 
Android best training-in-mumbai
Android best training-in-mumbaiAndroid best training-in-mumbai
Android best training-in-mumbai
 
"Micro-frontends from A to Z. How and Why we use Micro-frontends in Namecheap...
"Micro-frontends from A to Z. How and Why we use Micro-frontends in Namecheap..."Micro-frontends from A to Z. How and Why we use Micro-frontends in Namecheap...
"Micro-frontends from A to Z. How and Why we use Micro-frontends in Namecheap...
 

Kürzlich hochgeladen

%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
shinachiaurasa2
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
chiefasafspells
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
VictoriaMetrics
 

Kürzlich hochgeladen (20)

tonesoftg
tonesoftgtonesoftg
tonesoftg
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptx
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 

Asynchronous Programming in Android