Skip to content
CodeChain Dev — practical guides for Android, Kotlin & React Native

React Native Interview — Question & Answer

 

Basic Questions

Q1. What is React Native?

Answer:
React Native is a JavaScript framework built on React for developing cross-platform mobile applications. Instead of rendering HTML inside a WebView, React Native renders real native UI components for iOS and Android.

This allows us to share most of the business logic and UI code between platforms while still having access to native functionality when required.


Q2. What is the difference between React and React Native?

Answer:
React is primarily used for building web applications and renders UI to the browser DOM.

React Native uses the same React concepts such as components, props, state, hooks, and reconciliation, but instead of rendering HTML elements like div and span, it renders native components such as View, Text, and Image.

So the main difference is the rendering target:

  • React → Web DOM

  • React Native → Native iOS/Android UI


Q3. What are the advantages of React Native?

Answer:
The major advantages are:

  1. A single codebase can target both iOS and Android.

  2. Faster development and iteration.

  3. Large React and JavaScript ecosystem.

  4. Most business logic can be shared across platforms.

  5. Native modules can be used when platform-specific functionality is required.

  6. OTA updates can be used for eligible JavaScript-only changes.


Q4. What are the disadvantages of React Native?

Answer:
Some disadvantages include:

  • Platform-specific issues may still require native iOS or Android knowledge.

  • Some functionality requires custom native modules.

  • The application can have a larger binary size than a purely native application.

  • Poorly optimized JavaScript, lists, images, or animations can cause performance problems.

  • Major React Native upgrades can sometimes require significant migration work.


Q5. What are the core components of React Native?

Answer:
Some of the commonly used core components are:

View, Text, Image, ScrollView, FlatList, SectionList, TextInput, Pressable, Modal, ActivityIndicator, Button, and SafeAreaView.


Virtual DOM

Q6. What is Virtual DOM and how does it work?

Answer:
The Virtual DOM is an in-memory representation of the UI.

When state or props change, React creates a new element tree and compares it with the previous tree through reconciliation. React determines what actually changed and commits the required updates to the host environment.

In React Native, the final target is native UI rather than the browser DOM.


Q7. What is reconciliation in React Native?

Answer:
Reconciliation is the process React uses to compare the previous element tree with the new element tree.

React determines:

  • Which elements changed

  • Which elements were added

  • Which elements were removed

  • Which list items moved

Keys are particularly important for lists because they help React identify items consistently between renders.


Q8. What are the main threads in React Native?

Answer:
The important execution areas include:

  • JavaScript thread — application JavaScript and React logic.

  • UI/Main thread — native rendering and user interaction.

  • Shadow/layout thread — layout calculations using Yoga.

  • Native background threads — native modules can perform heavy operations away from the UI thread.

With the New Architecture, JSI and Fabric reduce some of the communication overhead associated with the old bridge architecture.


FlatList

Q9. What is FlatList?

Answer:
FlatList is React Native's optimized component for rendering large lists.

It uses virtualization, meaning it doesn't mount every item at once. Instead, it renders the visible items and a configurable buffer around them.

This improves memory usage and performance compared with rendering a large dataset inside a ScrollView.


Q10. What are the advantages of FlatList over ScrollView?

Answer:

FlatListScrollView
Uses virtualizationRenders all children
Suitable for large listsBetter for small content
Better memory usageCan consume more memory
Supports onEndReachedNo built-in pagination
Supports pull-to-refreshRequires additional handling
Supports optimized renderingSimple but less suitable for huge lists

I would generally use FlatList when the number of items can become large or is dynamically loaded.


Q11. Do we need a ScrollView around FlatList?

Answer:
No. FlatList already provides scrolling functionality.

Wrapping a FlatList inside another vertical ScrollView is generally unnecessary and can introduce nested scrolling and virtualization problems.


Q12. How do you optimize a FlatList?

Answer:
For a large list, I would consider:

  • React.memo() for list-item components

  • Stable keyExtractor

  • useCallback() for stable callbacks

  • getItemLayout when item dimensions are predictable

  • Appropriate windowSize

  • initialNumToRender

  • maxToRenderPerBatch

  • Avoiding expensive calculations inside renderItem

  • Optimizing images

  • Avoiding unnecessary state updates

I would also profile the actual bottleneck rather than blindly changing FlatList parameters.


State & Props

Q13. What is state?

Answer:
State is data owned by a component that can change over time. When state changes, React schedules a re-render.

In functional components, state is commonly managed using useState or useReducer.


Q14. What are props?

Answer:
Props are read-only values passed from a parent component to a child component.

They are commonly used to configure a component or pass data and callbacks.

For example:

<Profile
  name="Salil"
  onPress={handleProfilePress}
/>

Here, name and onPress are props.


Q15. What is the difference between state and props?

Answer:

StateProps
Owned by the componentPassed by the parent
Can be updated by the componentRead-only from child's perspective
Used for internal/dynamic dataUsed to configure a child
Updating state triggers renderingNew props can trigger rendering

A simple way to remember it:

State belongs to the component; props come from outside the component.


Hooks

Q16. What are React Hooks?

Answer:
Hooks are functions that allow functional components to use React features such as state, effects, context, and refs without using class components.

Common hooks include:

useState, useEffect, useMemo, useCallback, and useRef.


Q17. Explain useState, useEffect, useCallback, useMemo and useRef.

Answer:

useState
Manages local component state.

useEffect
Handles side effects such as API calls, subscriptions, timers, and other external interactions.

useCallback
Memoizes a function reference so that the function isn't recreated unnecessarily when dependencies haven't changed.

useMemo
Memoizes a calculated value to avoid repeating an expensive calculation unnecessarily.

useRef
Stores a mutable value that persists across renders without causing a re-render. It is also commonly used for references to native components.


Q18. How do you update state based on the previous state?

Answer:
Use the functional form of the state setter:

setCount(prev => prev + 1);

This is important when the new state depends on the previous state because React may batch state updates.


Redux

Q19. What is Redux?

Answer:
Redux is a predictable state-management library that provides centralized application state.

The typical flow is:

UI → Dispatch Action → Reducer/Middleware → Store Update → UI Re-render

Reducers should be pure functions and state should be updated immutably.


Q20. What is Redux Saga?

Answer:
Redux Saga is middleware that uses JavaScript generator functions to manage asynchronous operations and side effects.

It is useful for complex workflows such as:

  • API requests

  • Cancellation

  • Debouncing

  • Race conditions

  • Sequential operations

  • Background workflows

For simpler applications, Redux Toolkit with createAsyncThunk or another async approach may be sufficient.


Performance

Q21. What are common React Native performance problems?

Answer:
Common problems include:

  • Unnecessary re-renders

  • Poorly optimized FlatLists

  • Heavy JavaScript execution

  • Large unoptimized images

  • Memory leaks

  • Excessive JS/native communication

  • Expensive calculations during rendering

  • Heavy work blocking the UI experience

I would first profile the application to identify whether the bottleneck is JavaScript, rendering, layout, memory, networking, or native code.


Q22. How do you prevent memory leaks?

Answer:
I make sure that resources created by a component are cleaned up when the component unmounts.

For example:

  • Clear timers

  • Remove event listeners

  • Unsubscribe from subscriptions

  • Cancel network requests where appropriate

  • Clean up navigation listeners

  • Avoid retaining large objects unnecessarily

With hooks, cleanup is commonly handled inside the function returned from useEffect.


Modern React Native

Q23. What is Fabric?

Answer:
Fabric is React Native's modern rendering system and is part of the New Architecture.

It provides a more efficient rendering pipeline and works with the newer architecture based around technologies such as JSI and the C++ core.

The goal is better performance, more direct JS/native interaction, and better support for modern React capabilities.


Q24. What is the difference between the old architecture and New Architecture?

Answer:

Old Architecture:

JavaScript → Bridge → Native

Communication relied heavily on asynchronous message passing and serialization.

New Architecture:

JavaScript → JSI / TurboModules / Fabric → Native

The New Architecture reduces the communication overhead and provides a more direct interaction between JavaScript and native code.


Q25. How do you test a React Native application?

Answer:
I would use different testing levels depending on the requirement:

  • Jest — unit and logic testing

  • React Native Testing Library — component and interaction testing

  • Detox / Maestro — end-to-end testing

For a production application, I would combine unit, component, integration, and E2E testing rather than relying on only one type.

React Native Senior Interview — Additional Questions & Answers

12. Advanced React Native Questions

Q1. What happens when you call setState or a state setter?

Answer:

When state changes, React schedules a re-render. React creates the next component tree, compares it with the previous tree during reconciliation, and commits the required updates to the native UI.

Senior point:
A state update does not necessarily mean the entire screen is recreated. React updates the affected parts of the tree based on reconciliation.


Q2. Why does a React Native component re-render?

Answer:

A component can re-render when:

  • Its state changes.

  • Its parent re-renders.

  • Its props change.

  • Its context value changes.

  • An external state subscription updates.

A re-render is not automatically a performance problem. The important thing is whether expensive work or unnecessary native updates happen as a result.


Q3. How do you prevent unnecessary re-renders?

Answer:

I first identify the actual cause using profiling tools. Then I use techniques such as:

  • React.memo

  • useMemo

  • useCallback

  • stable object and function references

  • proper component boundaries

  • optimized selectors

  • normalized state

  • FlatList optimization

I avoid blindly adding useMemo and `useCallback because they also have overhead.


Q4. What is React.memo?

Answer:

React.memo prevents a functional component from rendering when its props have not changed based on shallow comparison.

const UserCard = React.memo(({ user }) => {
  return <Text>{user.name}</Text>;
});

It is especially useful for expensive list items, provided the props remain referentially stable.


Q5. What is referential equality?

Answer:

JavaScript compares objects and functions by reference rather than their contents.

{} === {} // false

This matters in React because creating new objects or functions on every render can make memoized components render again.


Q6. What is a stale closure?

Answer:

A stale closure happens when a function captures an older value from a previous render.

For example, an effect or callback may continue using an old state value because its dependency list is incorrect.

I handle this by using correct dependencies, functional state updates, or refs when appropriate.


Q7. When should you use a functional state update?

Answer:

When the new state depends on the previous state.

setCount(prev => prev + 1);

This is safer than:

setCount(count + 1);

especially when multiple updates can be scheduled.


Q8. What is batching in React?

Answer:

React can group multiple state updates together and perform fewer renders instead of rendering after every individual update.

This reduces unnecessary work and improves UI performance.


13. JavaScript Questions for React Native

Q9. What is the JavaScript event loop?

Answer:

JavaScript executes synchronous code on the call stack. Asynchronous operations are handled by the runtime, and their callbacks are placed into queues. The event loop processes queued work when the call stack becomes available.

In React Native, understanding this is important because heavy JavaScript work can block the JS thread and affect responsiveness.


Q10. What is the difference between synchronous and asynchronous code?

Answer:

Synchronous code executes sequentially and blocks until it completes.

Asynchronous code allows other work to continue while waiting for an operation such as a network request, timer, or file operation.


Q11. Promise vs async/await?

Answer:

async/await is syntax built on top of Promises. I generally prefer async/await because it makes asynchronous control flow easier to read and error handling with try/catch is straightforward.


Q12. What is the difference between == and ===?

Answer:

== performs type coercion before comparison, while === checks both value and type.

In production React Native code, I generally use === because it provides predictable behavior.


Q13. Explain let, const, and var.

Answer:

let and const are block-scoped. const prevents reassignment of the variable binding.

var is function-scoped and has hoisting behavior that can cause bugs, so modern JavaScript generally uses const and let.


Q14. What is debouncing?

Answer:

Debouncing delays execution until the user stops triggering an event for a specified period.

A common React Native example is search:

User types:
c → ca → car → cars

Instead of calling the API four times,
wait until typing stops and call it once.

Q15. What is throttling?

Answer:

Throttling limits how frequently a function can execute.

For example, during a scroll event, instead of processing hundreds of events continuously, we can process them at a controlled interval.


14. Navigation

Q16. How does React Navigation work?

Answer:

React Navigation manages navigation state and renders navigators such as:

  • Stack

  • Bottom Tab

  • Drawer

  • Native Stack

Navigation state determines which screen is active and what the navigation history looks like.


Q17. Stack Navigator vs Native Stack?

Answer:

A JavaScript-based stack provides more flexibility but may involve more JS-side work.

Native Stack uses native navigation primitives and can provide more native behavior and performance.

The choice depends on application requirements and the navigation library/version being used.


Q18. How do you protect authenticated screens?

Answer:

I maintain authentication state centrally and conditionally render authenticated and unauthenticated navigation flows.

For example:

App
 ├── Loading
 ├── Auth Stack
 └── Main App
      ├── Home
      ├── Profile
      └── Settings

I also make sure authorization is enforced on the backend. Navigation guards are UX protection, not a security boundary.


Q19. How would you handle deep linking?

Answer:

I configure URL schemes/universal links/app links and map incoming URLs to navigation routes.

For example:

myapp://payment/123

could open:

PaymentDetails

with transaction ID 123.

I also validate the incoming parameters before performing sensitive actions.


Q20. How do you handle navigation state after app restart?

Answer:

For required use cases, navigation state can be persisted and restored. However, I avoid persisting sensitive navigation data blindly and ensure authentication state is validated before restoring protected screens.


15. Native Android / iOS Questions

Q21. When would you write native code instead of React Native code?

Answer:

I use native code when:

  • RN doesn't expose the required API.

  • A device-specific feature is needed.

  • Performance-critical functionality requires native implementation.

  • Existing native SDKs need integration.

  • Bluetooth, payments, biometrics, background services, or OS-specific APIs require deeper platform access.


Q22. How do you create a native module for React Native?

Answer:

I define a native API that can be called from JavaScript and implement the platform-specific functionality in Kotlin/Java for Android or Swift/Objective-C for iOS.

With the New Architecture, I would consider TurboModules and the typed/codegen-based approach where appropriate.


Q23. What is a Native Module?

Answer:

A Native Module exposes platform functionality to React Native JavaScript.

For example:

React Native
     ↓
Native Module
     ↓
Android/iOS API
     ↓
Device capability

Examples include Bluetooth, biometrics, payment SDKs and custom device APIs.


Q24. What is JSI?

Answer:

JSI, or JavaScript Interface, provides a C++ interface that allows JavaScript to interact more directly with native/C++ functionality without relying on the traditional serialized bridge for every interaction.

It is an important foundation of React Native's New Architecture.


Q25. What is Fabric?

Answer:

Fabric is React Native's modern rendering system. It uses a shared C++ core and improves communication between React and native rendering.

It is part of the New Architecture alongside technologies such as TurboModules and JSI.


Q26. What are TurboModules?

Answer:

TurboModules are the modern native module system in React Native.

One important benefit is lazy loading, meaning native modules don't necessarily have to be initialized immediately at application startup.


16. Android-Specific Interview Questions

Q27. What is the Android Activity lifecycle?

Answer:

The common lifecycle is:

onCreate
   ↓
onStart
   ↓
onResume
   ↓
onPause
   ↓
onStop
   ↓
onDestroy

Understanding it is important when integrating React Native with native Android functionality.


Q28. What happens when an Android app goes into the background?

Answer:

The Activity can move through lifecycle states and the operating system may reclaim resources if necessary.

For long-running background work, I don't assume that JavaScript will continue executing indefinitely. I use appropriate Android background mechanisms depending on the requirement.


Q29. How do you handle Android back button behavior?

Answer:

I handle it through the navigation system or BackHandler when custom behavior is required.

For example:

BackHandler.addEventListener(
  'hardwareBackPress',
  handleBackPress
);

I always remove the listener during cleanup.


Q30. What causes ANR on Android?

Answer:

ANR, or Application Not Responding, can occur when the main UI thread is blocked for too long.

Common causes include:

  • Heavy computation

  • Large synchronous operations

  • Blocking I/O

  • Poor native code

  • Excessive work on the main thread

The solution is to move expensive work away from the UI thread and profile the actual bottleneck.


17. Performance Debugging

Q31. Your React Native app is slow. How would you investigate?

Answer:

I don't immediately optimize random components.

My process is:

Reproduce
   ↓
Measure
   ↓
Identify bottleneck
   ↓
Profile JS/native/UI
   ↓
Fix
   ↓
Measure again

I investigate:

  • startup time

  • JS thread

  • UI thread

  • memory

  • network

  • image loading

  • list rendering

  • unnecessary renders

  • native modules


Q32. What causes dropped frames?

Answer:

Dropped frames happen when the application cannot complete the required work within the frame budget.

Possible causes include:

  • expensive JavaScript

  • expensive layout

  • large images

  • excessive rendering

  • animation work

  • blocking native/UI thread work


Q33. How would you optimize a screen containing 5,000 items?

Answer:

I would use a virtualized list such as FlatList or another appropriate high-performance list.

Then I would investigate:

  • stable keys

  • memoized row components

  • getItemLayout where possible

  • batch rendering

  • window size

  • image optimization

  • pagination

  • server-side filtering

  • avoiding unnecessary state updates

I would measure performance rather than blindly tuning every property.


Q34. FlatList is still lagging. What do you check?

Answer:

I check:

  1. Whether renderItem is expensive.

  2. Whether each item unnecessarily re-renders.

  3. Whether images are large.

  4. Whether item heights are dynamic.

  5. Whether keyExtractor is stable.

  6. Whether callbacks and objects are recreated unnecessarily.

  7. Whether the dataset is too large.

  8. Whether pagination is needed.

  9. Whether JS thread work is blocking scrolling.


Q35. How do you optimize app startup?

Answer:

I measure cold startup first.

Then I look at:

  • bundle size

  • JavaScript execution

  • unnecessary initialization

  • native module initialization

  • API calls during startup

  • image loading

  • fonts

  • analytics initialization

  • large synchronous computations

I defer non-critical work until after the first useful screen is displayed.


18. Memory Management

Q36. How do you identify a memory leak?

Answer:

I reproduce the problem repeatedly and monitor memory usage using tools such as Android Studio Profiler or Xcode Instruments.

In React Native I specifically inspect:

  • event listeners

  • timers

  • subscriptions

  • navigation listeners

  • WebSocket connections

  • large closures

  • image resources

  • unmounted components retaining references


Q37. Give an example of a common React memory leak.

Answer:

A common example is an event listener registered inside an effect without cleanup.

Correct approach:

useEffect(() => {
  const subscription = subscribe();

  return () => {
    subscription.remove();
  };
}, []);

19. API Architecture

Q38. How would you design API handling in a large React Native application?

Answer:

I separate API infrastructure from UI components.

For example:

src/
 ├── api/
 │    ├── client.ts
 │    ├── auth.ts
 │    ├── users.ts
 │    └── payments.ts
 │
 ├── features/
 ├── components/
 ├── navigation/
 └── store/

The API client handles common concerns such as:

  • authentication

  • headers

  • timeout

  • error handling

  • refresh tokens

  • logging

  • request cancellation


Q39. How do you handle token refresh?

Answer:

When an API returns an authentication failure because the access token expired, I use the refresh token to obtain a new access token.

For concurrent requests, I avoid sending multiple refresh requests simultaneously. I use a refresh queue or shared refresh promise and retry the pending requests after the token is refreshed.


Q40. What happens if the refresh token also expires?

Answer:

The session is considered invalid.

I clear the authentication state securely and redirect the user to the login flow.

Sensitive tokens should be stored using secure platform storage rather than ordinary unencrypted storage.


Q41. How do you handle API retries?

Answer:

I don't retry every failure.

I distinguish between:

  • network failures

  • timeout

  • server errors

  • authentication failures

  • client validation errors

For retryable transient failures, I can use exponential backoff with a retry limit.


20. Offline-First Questions

Q42. How would you make a React Native application work offline?

Answer:

I first classify the data:

Critical local data
Cached server data
User-generated pending actions
Temporary UI state

I persist appropriate data locally, detect connectivity, cache server responses, and queue mutations that can safely be synchronized later.


Q43. What is optimistic UI?

Answer:

Optimistic UI updates the interface immediately assuming the server operation will succeed.

For example:

User likes post
      ↓
UI immediately shows Like
      ↓
API request
      ↓
Success → keep state
Failure → rollback

It improves perceived performance but requires proper rollback handling.


21. Security

Q44. How do you secure a React Native application?

Answer:

I use multiple layers:

  • HTTPS

  • secure token storage

  • certificate/public-key pinning where justified

  • biometric authentication for sensitive actions

  • server-side authorization

  • input validation

  • secure logging

  • protection of secrets

  • dependency updates

  • obfuscation/minification where appropriate

I never treat client-side security as a replacement for backend authorization.


Q45. Can API keys be hidden inside a mobile app?

Answer:

No truly secret credential can be considered completely secure if it must be shipped to the client.

Anything embedded in the application can potentially be extracted.

Sensitive credentials should remain on a trusted backend.


Q46. Should authentication tokens be stored in AsyncStorage?

Answer:

For sensitive authentication credentials, I prefer platform-secure storage such as Keychain/Keystore-backed solutions.

AsyncStorage is not encrypted by default and should not be treated as a secure secret store.


Q47. How would you implement biometric login?

Answer:

I use the platform biometric APIs or a trusted React Native library.

The biometric check unlocks access to a securely stored credential rather than acting as the backend authentication mechanism itself.


22. Error Handling

Q48. How do you handle errors globally?

Answer:

I use multiple levels:

Component errors
      ↓
Feature-level handling
      ↓
API error handling
      ↓
Global logging/crash reporting

For production I use tools such as Crashlytics or Sentry to capture crashes and useful context.


Q49. What is an Error Boundary?

Answer:

An Error Boundary catches JavaScript rendering errors in its child component tree and allows the application to show fallback UI instead of crashing the entire React tree.

Traditional React Error Boundaries use class lifecycle methods such as componentDidCatch.


Q50. How do you handle API errors shown to users?

Answer:

I separate technical errors from user-facing messages.

For example:

HTTP 500
   ↓
Log technical details
   ↓
Show user-friendly message
   ↓
Offer retry where appropriate

I avoid displaying raw backend errors directly to users.


23. TypeScript

Q51. Why use TypeScript in React Native?

Answer:

TypeScript provides static typing, better IDE support, safer refactoring, and catches many errors before runtime.

It becomes particularly valuable in large applications with shared models, navigation parameters, API responses, and complex state.


Q52. Interface vs type?

Answer:

Both can describe object shapes.

interface is commonly useful for extensible object contracts, while type is more flexible for unions, intersections and aliases.

The important point in a team is consistency rather than choosing one universally.


Q53. How do you type React Navigation parameters?

Answer:

I define a central parameter list.

For example:

type RootStackParamList = {
  Home: undefined;
  Profile: { userId: string };
  Details: { id: number };
};

This gives compile-time validation when navigating between screens.


24. Redux / State Architecture

Q54. When should you use Redux?

Answer:

I use Redux when the application has substantial shared state, complex state transitions, predictable debugging requirements, or many features that need access to the same state.

I don't introduce Redux just because the application has more than a few screens.


Q55. Redux vs Context API?

Answer:

Context is useful for relatively stable shared values such as theme, locale, or authentication context.

Redux provides a more structured state-management architecture with predictable updates, middleware, dev tooling, and scalable patterns.


Q56. Redux Toolkit vs traditional Redux?

Answer:

Redux Toolkit is the recommended modern approach because it reduces boilerplate and provides utilities for slices, immutable updates, middleware configuration, and async workflows.

I would generally choose Redux Toolkit for a new Redux application.


Q57. What is normalized state?

Answer:

Instead of deeply nesting duplicated objects, related entities are stored independently and referenced by IDs.

For example:

users:
  1 → User A
  2 → User B

posts:
  10 → { authorId: 1 }

This reduces duplication and makes updates easier.


25. Architecture / System Design

Q58. How would you structure a large React Native application?

Answer:

I prefer feature-oriented architecture.

src/
 ├── features/
 │    ├── auth/
 │    ├── payments/
 │    ├── profile/
 │    └── trading/
 │
 ├── components/
 ├── navigation/
 ├── services/
 ├── store/
 ├── hooks/
 ├── utils/
 ├── theme/
 └── types/

Each feature owns its screens, components, API logic and state where appropriate.

The goal is strong module boundaries rather than simply creating many folders.


Q59. How do you design a scalable React Native application?

Answer:

I focus on:

  • feature boundaries

  • reusable design system

  • typed APIs

  • predictable state management

  • navigation architecture

  • testing strategy

  • error handling

  • analytics

  • performance monitoring

  • CI/CD

  • native integration strategy

Architecture should evolve with product requirements rather than becoming unnecessarily complex from day one.


Q60. Monorepo or separate repositories?

Answer:

It depends on the organization.

A monorepo can make code sharing and coordinated changes easier across mobile, web and backend packages.

Separate repositories can provide stronger isolation and independent release processes.

I would decide based on team structure, deployment requirements and the amount of genuinely shared code.


26. CI/CD

Q61. Explain a React Native CI/CD pipeline.

Answer:

A typical pipeline is:

Git Push
   ↓
Lint
   ↓
Type Check
   ↓
Unit Tests
   ↓
Build
   ↓
E2E Tests
   ↓
Signing
   ↓
Artifact
   ↓
Test Distribution
   ↓
Store Release

Tools can include GitHub Actions, Fastlane, Bitrise, Firebase App Distribution and the respective app-store systems.


Q62. How do you manage Android signing?

Answer:

Keystore credentials should never be committed to Git.

I store signing credentials securely in CI/CD secret storage and inject them during the build process.


Q63. What is the difference between debug and release builds?

Answer:

Debug builds are optimized for development and debugging.

Release builds enable production optimizations, use production configuration, signing credentials and generally disable development tooling.

Performance characteristics can therefore differ significantly.


27. Testing

Q64. What should you unit test in React Native?

Answer:

I focus on business logic, utilities, hooks and important state transitions.

For UI components, I test user-visible behavior rather than implementation details.


Q65. What is the difference between unit, integration and E2E testing?

Answer:

Unit: tests an isolated function or small piece of logic.

Integration: tests multiple pieces working together.

E2E: tests the complete application flow from the user's perspective.


Q66. What should an E2E test cover?

Answer:

Important business-critical flows such as:

  • login

  • registration

  • payment

  • checkout

  • transaction

  • logout

  • critical navigation

I don't try to reproduce every unit test at the E2E level.


28. Real-World Scenario Questions

Q67. Production app crashes only on Android. What do you do?

Answer:

First I collect crash information and identify the affected Android versions/devices.

Then I reproduce if possible and inspect:

  • Crashlytics/Sentry

  • native stack trace

  • JavaScript stack

  • recent releases

  • native dependencies

  • ProGuard/R8 mapping if applicable

Then I create a minimal reproduction and release a controlled fix.


Q68. API is taking 8 seconds. Would you optimize React Native?

Answer:

Not necessarily.

I first determine where the eight seconds are spent:

App
 ↓
DNS/network
 ↓
Backend
 ↓
Database
 ↓
Response
 ↓
Parsing
 ↓
Rendering

If the backend takes seven seconds, optimizing the React component won't solve the root problem.


Q69. The UI freezes when processing a large JSON response. Why?

Answer:

Parsing and processing a large response can consume significant JavaScript-thread time.

I would profile the operation and consider:

  • reducing response size

  • pagination

  • server-side filtering

  • moving heavy processing away from the critical UI path

  • restructuring the API response

  • native/background processing where justified


Q70. Your FlatList has only 100 items but still feels slow. Why?

Answer:

Item count isn't the only factor.

The problem may be:

  • expensive row rendering

  • huge images

  • nested components

  • unnecessary state updates

  • animations

  • expensive selectors

  • synchronous JavaScript work

I would profile the row and JS/UI thread before changing FlatList settings.


29. Leadership Questions

Q71. How do you conduct code reviews?

Answer:

I focus on:

  1. Correctness

  2. Architecture

  3. Maintainability

  4. Security

  5. Performance

  6. Testing

  7. Consistency

I try to explain the reason behind a requested change rather than simply saying "change this."


Q72. How do you mentor junior developers?

Answer:

I prefer a combination of code reviews, pairing, architecture discussions and gradually increasing ownership.

The goal is not just to fix their current code but to help them understand the reasoning behind the solution.


Q73. What if another developer disagrees with your architecture decision?

Answer:

I focus the discussion on requirements, constraints and measurable trade-offs rather than personal preference.

If necessary, we can create a small proof of concept, compare the approaches and make the decision based on evidence.


Q74. How do you handle technical debt?

Answer:

I categorize technical debt based on impact and risk.

Critical debt affecting security, reliability or delivery gets higher priority.

For lower-risk debt, I usually address it incrementally while working in the affected area instead of stopping feature development completely.


30. Project-Based Questions

Q75. Tell me about your most challenging React Native project.

Answer structure:

Use:

Problem
   ↓
Your responsibility
   ↓
Technical challenge
   ↓
Decision
   ↓
Implementation
   ↓
Result

Avoid giving only a feature list.


Q76. What was the biggest performance issue you solved?

Answer structure:

Explain:

  • What users experienced

  • How you measured it

  • Root cause

  • Changes you made

  • Before/after numbers

  • How you prevented regression

This is much stronger than saying "I optimized the app."


Q77. Tell me about a production bug you caused.

Answer:

Choose a genuine but recoverable example.

Explain:

  1. What happened.

  2. Why it happened.

  3. How you detected it.

  4. How you fixed it.

  5. What you changed afterward to prevent recurrence.

Don't blame another developer.


Q78. Tell me about a disagreement with a team member.

Answer:

Explain the technical disagreement objectively, how you evaluated both approaches, how the team reached a decision and what you learned.


Q79. Why should we hire you as a Senior React Native developer?

Answer structure:

Don't simply say "I have seven years of experience."

Talk about:

  • production ownership

  • architecture

  • performance

  • native integration

  • debugging

  • delivery

  • mentoring

  • business understanding

Then connect those strengths to the role.


31. Difficult Senior-Level Questions

Q80. React Native vs native Android/iOS — when would you choose native?

Answer:

I would choose fully native when platform-specific behavior, extremely demanding performance, deep OS integration or platform-specific UX is the dominant requirement.

I would choose React Native when cross-platform development, shared business logic and faster iteration provide significant value.

For many applications, a hybrid approach is also practical.


Q81. Can React Native achieve native performance?

Answer:

It can achieve excellent performance for many application types, but "native performance" is not a single measurable property.

The result depends on rendering, JavaScript workload, native modules, animations, networking, images and architecture.

The correct approach is to profile the actual bottleneck.


Q82. What is the biggest React Native performance mistake?

Answer:

Assuming that every performance problem is caused by React Native itself.

I first determine whether the bottleneck is JavaScript, native UI, network, backend, memory, images or application architecture.


Q83. How would you migrate an old React Native application to the New Architecture?

Answer:

I would not switch everything blindly.

I would:

Audit dependencies
      ↓
Check compatibility
      ↓
Upgrade RN/dependencies
      ↓
Enable New Architecture
      ↓
Run tests
      ↓
Fix incompatible native modules
      ↓
Profile
      ↓
Gradual production rollout

The migration should be driven by compatibility and measurable results.


Q84. How would you reduce app bundle size?

Answer:

I would measure the current bundle first.

Then investigate:

  • unused dependencies

  • large assets

  • duplicate libraries

  • unnecessary native dependencies

  • JavaScript bundle composition

  • image formats

  • fonts

  • build configuration

I would avoid removing dependencies without verifying their actual usage.


Q85. How would you design a fintech React Native application?

Answer:

I would prioritize:

  • secure authentication

  • secure credential storage

  • server-side authorization

  • transaction integrity

  • biometric protection

  • audit logging

  • secure networking

  • reliable error handling

  • idempotent transaction APIs

  • strong testing

  • crash monitoring

  • controlled releases

For financial operations, correctness and security are more important than simply making the UI fast.


32. Rapid-Fire Questions

Q86. What is useCallback?

Answer:
It memoizes a function reference between renders when dependencies don't change.

Q87. What is useMemo?

Answer:
It memoizes a calculated value between renders.

Q88. What is useRef?

Answer:
It stores a mutable value that persists across renders without causing a render when changed.

Q89. What is useEffect?

Answer:
It runs side-effect logic after rendering and can return a cleanup function.

Q90. What is React.memo?

Answer:
It memoizes a functional component and can skip rendering when props are unchanged.

Q91. What is Hermes?

Answer:
Hermes is a JavaScript engine optimized for React Native applications.

Q92. What is Fast Refresh?

Answer:
Fast Refresh updates React component code during development while attempting to preserve component state.

Q93. What is OTA update?

Answer:
An over-the-air update can deliver certain JavaScript/assets changes without requiring a full native binary release, subject to platform and store policies.

Q94. What is a race condition?

Answer:
A race condition occurs when the result depends on the timing/order of concurrent operations.

Q95. What is idempotency?

Answer:
An operation is idempotent when repeating the same request produces the same intended result.

This is particularly important for payment and transaction APIs.

Q96. What is pagination?

Answer:
Pagination loads data in smaller chunks instead of downloading the entire dataset at once.

Q97. What is lazy loading?

Answer:
Lazy loading means loading a resource only when it is actually needed.

Q98. What is code splitting?

Answer:
Code splitting divides application code into smaller chunks so that not everything needs to be loaded immediately.

Q99. What is memoization?

Answer:
Memoization caches a previous computation or reference so repeated work can be avoided when inputs have not changed.

Q100. What is normalization?

Answer:
Normalization structures data to reduce duplication and make updates more predictable.

33. Interview Rule for Senior Candidates

For every technical question, try to answer in this order:

1. Direct answer → 2. Why → 3. Real example → 4. Trade-off

Example:

"I would use FlatList for a large dataset because it virtualizes items. In one production scenario, I would also profile the row rendering because FlatList itself doesn't solve expensive renderItem logic. If row height is predictable, I can additionally use getItemLayout."

That sounds much more senior than simply saying:

"FlatList is better because it is optimized."

34. Final Preparation Checklist

Before the interview, be able to explain without memorizing:

  • React vs React Native

  • Old Bridge vs JSI

  • New Architecture

  • Fabric

  • TurboModules

  • Hermes

  • React rendering/reconciliation

  • Hooks

  • stale closures

  • memoization

  • FlatList internals

  • performance profiling

  • JS thread vs UI thread

  • memory leaks

  • navigation

  • deep linking

  • native modules

  • Android lifecycle

  • iOS lifecycle

  • API architecture

  • token refresh

  • secure storage

  • offline architecture

  • optimistic updates

  • Redux Toolkit

  • Context vs Redux

  • TypeScript

  • testing pyramid

  • CI/CD

  • app signing

  • crash monitoring

  • architecture design

  • security

  • fintech considerations

  • mentoring

  • code reviews

  • technical debt

  • production incident handling

Most importantly, prepare 5 real stories from your own projects:

  1. A performance problem you solved

  2. A difficult production bug

  3. A major architecture decision

  4. A native Android/iOS integration

  5. A feature where you led or mentored other developers

These stories can be reused across dozens of senior-level interview questions.


💡

Have questions, optimizations, or an alternative solution?

Join the developer discussion below. Share edge cases, performance benchmarks, or questions about this implementation.

Jump to Discussion ↓

No comments:

Post a Comment