Introduction to
Networking in Android
A comprehensive guide to REST APIs, JSON parsing, Retrofit, and Kotlin Coroutines for building robust, dynamic mobile applications.
What is Networking in Mobile Applications
Networking in Android refers to the process of sending and receiving data between a mobile application and a remote server over the internet. Almost every modern mobile app relies on networking for functionality. Think about applications like news readers, messaging apps, or e-commerce platforms—they all retrieve data from servers using network requests.
Networking typically works through the HTTP or HTTPS protocol, which allows applications to request resources such as JSON data, images, videos, and other files from a server. These responses are then processed and displayed inside the application. Android provides several ways to perform networking operations, including low-level APIs like HttpURLConnection and modern libraries like Retrofit and OkHttp.
⚠ Critical Rule: Network operations cannot run on the main UI thread. If a network request blocks the UI thread, the application may freeze and eventually crash due to an Application Not Responding (ANR) error. This is why networking must always be handled asynchronously using background threads, coroutines, or other concurrency mechanisms.
Networking also introduces concerns like latency, security, authentication, and error handling. Developers must ensure that requests are secure, responses are validated, and the application behaves gracefully if the internet connection fails. When implemented correctly, networking forms the backbone of dynamic mobile experiences.
How Android Communicates with Servers
Android communicates with servers using a client-server architecture. In this architecture, the Android app acts as the client, while a remote server hosts data and services. The client sends requests to the server, and the server responds with data.
The Process Flow
- The app sends an HTTP request to a server.
- The server processes the request.
- The server returns a response, usually in JSON format.
- The app parses the response and displays the data.
Most Android apps communicate with servers through REST APIs. These APIs define endpoints that the application can access. For example:
https://api.example.com/users
A GET request to this endpoint might return data like:
{
"id": 1,
"name": "Vipul",
"email": "Vipul@example.com"
}
The application receives this JSON data and converts it into usable objects using JSON parsing libraries. Libraries such as Retrofit make this process significantly easier by automatically converting JSON responses into Kotlin objects. Retrofit also handles network calls efficiently and integrates well with Kotlin Coroutines, making asynchronous programming easier and cleaner.
Understanding Android Permissions
Why Internet Permission is Required
Android uses a permission-based security model to protect user privacy and device resources. Any application that wants to access sensitive resources—like the camera, storage, or internet—must request permission from the system.
For networking, the most important permission is INTERNET permission. Without this permission, your application cannot communicate with servers or load data from the internet.
This permission ensures that apps cannot secretly access the internet without being declared in the application's configuration. Although the internet permission is automatically granted during installation, it must still be declared in the app's manifest file.
Developers must therefore carefully declare the required permissions and ensure that they only request permissions that are absolutely necessary. This improves trust and avoids unnecessary security risks.
Adding Internet Permission in AndroidManifest
To enable networking in an Android application, the following permission must be added inside the AndroidManifest.xml file:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.networkapp">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:label="NetworkApp">
</application>
</manifest>
Once this permission is declared, the application can perform internet operations such as API calls and data downloads.
Understanding JSON and Data Exchange
What is JSON Format
JSON (JavaScript Object Notation) is the most widely used data format for exchanging information between servers and applications. It is lightweight, human-readable, and easy to parse in most programming languages.
A JSON structure typically consists of key-value pairs, similar to a dictionary or map:
{
"name": "Rutva",
"age": 25,
"city": "London"
}
JSON is extremely popular in modern APIs because it is compact and easy to transmit over the internet. Compared to older formats like XML, JSON requires less bandwidth and is simpler to process.
JSON Objects vs JSON Arrays
JSON data typically appears in two forms:
| Type | Description | Example |
|---|---|---|
| JSON Object | Contains key-value pairs | { "name": "Vipul" } |
| JSON Array | Contains a list of objects | [{"name":"Vipul"},{"name":"Jane"}] |
Example JSON Array:
[
{
"id": 1,
"title": "First Post"
},
{
"id": 2,
"title": "Second Post"
}
]
Applications must determine whether they are receiving an object or an array before parsing the data correctly.
JSON Parsing in Android with Kotlin
Creating Data Classes for JSON
In Kotlin, JSON responses are often converted into data classes. A data class automatically generates useful methods such as toString(), equals(), and copy().
Example JSON:
{
"id": 1,
"title": "Hello",
"body": "Example text"
}
Kotlin Data Class:
data class Post(
val id: Int,
val title: String,
val body: String
)
Libraries like Gson, Moshi, and Kotlin Serialization automatically map JSON fields to Kotlin properties, reducing manual parsing work.
Manual JSON Parsing Example
Example using JSONObject:
val jsonString = """
{
"name":"Rutva",
"age":22
}
"""
val jsonObject = JSONObject(jsonString)
val name = jsonObject.getString("name")
val age = jsonObject.getInt("age")
println("Name: $name Age: $age")
This approach works, but it becomes cumbersome when handling large responses. That's why developers typically use libraries like Retrofit combined with Gson.
Introduction to REST APIs
HTTP Methods in REST
REST APIs follow the HTTP protocol and provide standardized methods for interacting with resources.
| Method | Purpose |
|---|---|
| GET | Retrieve data |
| POST | Create new data |
| PUT | Update data |
| DELETE | Remove data |
REST APIs are extremely popular because they are stateless, scalable, and easy to integrate with web and mobile applications.
Example REST API Request
Example Kotlin request using HttpURLConnection:
val url = URL("https://jsonplaceholder.typicode.com/posts/1")
val connection = url.openConnection() as HttpURLConnection
connection.requestMethod = "GET"
val responseCode = connection.responseCode
println("Response Code: $responseCode")
Although this works, it requires a lot of boilerplate code. Retrofit simplifies this process significantly.
Retrofit Library in Android
What is Retrofit
Retrofit is a type-safe HTTP client for Android developed by Square. It simplifies network communication by allowing developers to define API endpoints as Kotlin interfaces.
Benefits of Retrofit
- Automatic JSON parsing
- Cleaner, more readable code
- Easy REST API integration
- Works seamlessly with Coroutines
- Supports multiple converters
Adding Retrofit Dependencies
Add dependencies in build.gradle:
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2'
Creating API Interface
Example API interface:
interface ApiService {
@GET("posts")
suspend fun getPosts(): List<Post>
}
Retrofit instance:
object RetrofitInstance {
val api: ApiService by lazy {
Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
}
Kotlin Coroutines for Networking
What Are Coroutines
Kotlin Coroutines are lightweight threads used for asynchronous programming. They allow developers to write non-blocking code that looks sequential and easy to understand. Instead of callbacks, coroutines use suspend functions.
Benefits
- Simpler async code
- Avoid callback hell
- Efficient background processing
Integration
- Works with ViewModel
- Works with LiveData
- viewModelScope built-in
Coroutine Example with Retrofit
class MainViewModel : ViewModel() {
fun fetchPosts() {
viewModelScope.launch {
try {
val posts = RetrofitInstance.api.getPosts()
println(posts)
} catch (e: Exception) {
println("Error: ${e.message}")
}
}
}
}
This code launches a coroutine and performs a network request without blocking the UI thread.
Handling Background Tasks in Android
Why Background Threads Are Important
Android enforces strict rules regarding the main UI thread. Any long-running operation such as file downloads, API calls, or database queries must run in the background.
If such tasks run on the UI thread:
- The app freezes
- Users cannot interact with the interface
- The system may terminate the app
Developers typically use the following tools for background work:
| Tool | Notes |
|---|---|
| Kotlin Coroutines | Recommended — integrates with ViewModel & LiveData |
| WorkManager | Deferred / scheduled background tasks |
| Executors | Low-level thread pool management |
| RxJava | Reactive programming pattern |
Coroutines are currently the recommended approach because they integrate seamlessly with Android architecture components like ViewModel and LiveData.
Conclusion
Networking is a fundamental part of modern Android development. Without it, applications would be limited to static functionality and offline data. By combining REST APIs, JSON parsing, Retrofit, and Kotlin Coroutines, developers can build robust networking layers that are efficient, scalable, and easy to maintain.
Understanding permissions ensures that applications follow Android's security model, while JSON parsing enables the conversion of server responses into meaningful objects. Retrofit simplifies API communication, and Coroutines make asynchronous programming clean and manageable.
Mastering these concepts allows developers to build apps that interact seamlessly with servers and deliver dynamic, real-time experiences to users.

0 Comments
If you have any doubts, Please let me know