mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-04-20 16:22:04 +00:00
push
This commit is contained in:
parent
383ac95e90
commit
714226b6a5
1 changed files with 0 additions and 237 deletions
|
|
@ -1,237 +0,0 @@
|
||||||
# FastImage Broken Images Fix
|
|
||||||
|
|
||||||
## Issue Description
|
|
||||||
After migrating to FastImage, posters were showing broken image icons when:
|
|
||||||
1. Navigating away from HomeScreen and returning
|
|
||||||
2. Going to the player and coming back
|
|
||||||
3. Any unmount/remount cycle of the HomeScreen
|
|
||||||
|
|
||||||
## Root Cause
|
|
||||||
The HomeScreen was aggressively clearing FastImage's memory cache in two places:
|
|
||||||
1. **On component unmount** - Clearing cache when leaving HomeScreen
|
|
||||||
2. **Before player navigation** - Clearing cache before opening the video player
|
|
||||||
|
|
||||||
This defeated the purpose of having a cache and caused broken images because:
|
|
||||||
- FastImage's disk cache requires the memory cache to load images efficiently
|
|
||||||
- Clearing memory cache on every navigation forces re-download from network
|
|
||||||
- The images weren't broken, just not yet reloaded from disk/network
|
|
||||||
|
|
||||||
## Solution Applied
|
|
||||||
|
|
||||||
### ✅ 1. Removed Aggressive Cache Clearing
|
|
||||||
**Location**: `HomeScreen.tsx` unmount cleanup
|
|
||||||
|
|
||||||
**Before**:
|
|
||||||
```typescript
|
|
||||||
useEffect(() => {
|
|
||||||
return () => {
|
|
||||||
// Clear image cache when component unmounts to free memory
|
|
||||||
try {
|
|
||||||
FastImage.clearMemoryCache();
|
|
||||||
} catch (error) {
|
|
||||||
console.warn('Failed to clear image cache:', error);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}, []);
|
|
||||||
```
|
|
||||||
|
|
||||||
**After**:
|
|
||||||
```typescript
|
|
||||||
useEffect(() => {
|
|
||||||
return () => {
|
|
||||||
// Don't clear FastImage cache on unmount - it causes broken images on remount
|
|
||||||
// FastImage's native libraries (SDWebImage/Glide) handle memory automatically
|
|
||||||
// Cache clearing only happens on app background (see AppState handler above)
|
|
||||||
};
|
|
||||||
}, []);
|
|
||||||
```
|
|
||||||
|
|
||||||
### ✅ 2. Removed Player Navigation Cache Clearing
|
|
||||||
**Location**: `HomeScreen.tsx` handlePlayStream
|
|
||||||
|
|
||||||
**Before**:
|
|
||||||
```typescript
|
|
||||||
const handlePlayStream = async (stream: Stream) => {
|
|
||||||
try {
|
|
||||||
// Clear image cache to reduce memory pressure before orientation change
|
|
||||||
await FastImage.clearMemoryCache();
|
|
||||||
// ... navigation code
|
|
||||||
}
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
**After**:
|
|
||||||
```typescript
|
|
||||||
const handlePlayStream = async (stream: Stream) => {
|
|
||||||
try {
|
|
||||||
// Don't clear cache before player - causes broken images on return
|
|
||||||
// FastImage's native libraries handle memory efficiently
|
|
||||||
// ... navigation code
|
|
||||||
}
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
### ✅ 3. Added Smart Background Cache Management
|
|
||||||
**Location**: `HomeScreen.tsx` new AppState handler
|
|
||||||
|
|
||||||
**Added**:
|
|
||||||
```typescript
|
|
||||||
useEffect(() => {
|
|
||||||
const subscription = AppState.addEventListener('change', nextAppState => {
|
|
||||||
if (nextAppState === 'background') {
|
|
||||||
// Only clear memory cache when app goes to background
|
|
||||||
// This frees memory while keeping disk cache intact for fast restoration
|
|
||||||
try {
|
|
||||||
FastImage.clearMemoryCache();
|
|
||||||
if (__DEV__) console.log('[HomeScreen] Cleared memory cache on background');
|
|
||||||
} catch (error) {
|
|
||||||
if (__DEV__) console.warn('[HomeScreen] Failed to clear memory cache:', error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
subscription?.remove();
|
|
||||||
};
|
|
||||||
}, []);
|
|
||||||
```
|
|
||||||
|
|
||||||
## How FastImage Caching Works
|
|
||||||
|
|
||||||
### Three-Tier Cache System
|
|
||||||
1. **Memory Cache** (fastest)
|
|
||||||
- In-RAM decoded images ready for immediate display
|
|
||||||
- Automatically managed by SDWebImage (iOS) / Glide (Android)
|
|
||||||
- Cleared only when system requests or app backgrounds
|
|
||||||
|
|
||||||
2. **Disk Cache** (fast)
|
|
||||||
- Downloaded images stored on device
|
|
||||||
- Persists across app launches
|
|
||||||
- Used to restore memory cache quickly
|
|
||||||
|
|
||||||
3. **Network** (slowest)
|
|
||||||
- Only used if image not in memory or disk cache
|
|
||||||
- Requires network connection
|
|
||||||
|
|
||||||
### Why Not Clear Cache on Navigation?
|
|
||||||
- **Memory cache is fast to rebuild** from disk cache (~10-50ms)
|
|
||||||
- **Disk cache persists** - no re-download needed
|
|
||||||
- **Native libraries are smart** - they handle memory pressure automatically
|
|
||||||
- **User experience** - instant image display when returning to screen
|
|
||||||
|
|
||||||
## Best Practices for Cache Management
|
|
||||||
|
|
||||||
### ✅ DO:
|
|
||||||
- Let FastImage's native libraries handle memory automatically
|
|
||||||
- Clear memory cache only when app goes to **background**
|
|
||||||
- Trust SDWebImage (iOS) and Glide (Android) - they're battle-tested
|
|
||||||
- Use `cache: FastImage.cacheControl.immutable` for all images
|
|
||||||
|
|
||||||
### ❌ DON'T:
|
|
||||||
- Clear cache on component unmount
|
|
||||||
- Clear cache before navigation
|
|
||||||
- Clear cache on every screen change
|
|
||||||
- Manually manage memory that native libraries handle better
|
|
||||||
|
|
||||||
### Optional Manual Cache Clearing
|
|
||||||
If you need to clear cache (e.g., in Settings):
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
// Clear memory cache only (fast, recoverable from disk)
|
|
||||||
await FastImage.clearMemoryCache();
|
|
||||||
|
|
||||||
// Clear disk cache (removes downloaded images, forces re-download)
|
|
||||||
await FastImage.clearDiskCache();
|
|
||||||
```
|
|
||||||
|
|
||||||
## Testing the Fix
|
|
||||||
|
|
||||||
### Before Fix:
|
|
||||||
1. ✅ Open HomeScreen - images load
|
|
||||||
2. ❌ Navigate to Metadata screen
|
|
||||||
3. ❌ Return to HomeScreen - broken image icons
|
|
||||||
4. ⏳ Wait 1-2 seconds - images reload
|
|
||||||
|
|
||||||
### After Fix:
|
|
||||||
1. ✅ Open HomeScreen - images load
|
|
||||||
2. ✅ Navigate to Metadata screen
|
|
||||||
3. ✅ Return to HomeScreen - images display instantly
|
|
||||||
4. ✅ No broken icons, no waiting
|
|
||||||
|
|
||||||
### After App Backgrounding:
|
|
||||||
1. ✅ Put app in background
|
|
||||||
2. ✅ Memory cache cleared (frees RAM)
|
|
||||||
3. ✅ Return to app
|
|
||||||
4. ✅ Images restore quickly from disk cache (~50ms)
|
|
||||||
|
|
||||||
## Memory Management
|
|
||||||
|
|
||||||
FastImage's native libraries handle memory efficiently:
|
|
||||||
|
|
||||||
### iOS (SDWebImage)
|
|
||||||
- Automatic memory warnings handling
|
|
||||||
- LRU (Least Recently Used) eviction
|
|
||||||
- Configurable cache size limits
|
|
||||||
- Image decompression on background threads
|
|
||||||
|
|
||||||
### Android (Glide)
|
|
||||||
- Automatic low memory detection
|
|
||||||
- Smart cache trimming based on device state
|
|
||||||
- Bitmap pooling for memory efficiency
|
|
||||||
- Activity lifecycle awareness
|
|
||||||
|
|
||||||
## Performance Impact
|
|
||||||
|
|
||||||
### Before Fix:
|
|
||||||
- 🐌 Image load on return: 500-2000ms (network re-download)
|
|
||||||
- 📉 Poor UX: broken icons visible to user
|
|
||||||
- 🔄 Unnecessary network traffic
|
|
||||||
- 🔋 Battery drain from re-downloads
|
|
||||||
|
|
||||||
### After Fix:
|
|
||||||
- ⚡ Image load on return: 10-50ms (disk cache restore)
|
|
||||||
- 😊 Great UX: instant image display
|
|
||||||
- 📈 Reduced network traffic
|
|
||||||
- 🔋 Better battery life
|
|
||||||
|
|
||||||
## Additional Notes
|
|
||||||
|
|
||||||
### When Images Might Still Break
|
|
||||||
Images will only show broken icons if:
|
|
||||||
1. **Network failure** during initial load
|
|
||||||
2. **Invalid image URL** provided
|
|
||||||
3. **Server returns 404/403** for the image
|
|
||||||
4. **Disk space full** preventing cache storage
|
|
||||||
|
|
||||||
These are legitimate failures, not cache clearing issues.
|
|
||||||
|
|
||||||
### How to Debug
|
|
||||||
If images are still broken after this fix:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
// Add to component
|
|
||||||
useEffect(() => {
|
|
||||||
const checkImage = async () => {
|
|
||||||
try {
|
|
||||||
const response = await fetch(imageUrl, { method: 'HEAD' });
|
|
||||||
console.log('Image reachable:', response.ok);
|
|
||||||
} catch (error) {
|
|
||||||
console.log('Image network error:', error);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
checkImage();
|
|
||||||
}, [imageUrl]);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Conclusion
|
|
||||||
|
|
||||||
The fix ensures:
|
|
||||||
- ✅ No broken images on navigation
|
|
||||||
- ✅ Instant image display on screen return
|
|
||||||
- ✅ Efficient memory management
|
|
||||||
- ✅ Better user experience
|
|
||||||
- ✅ Reduced network usage
|
|
||||||
- ✅ Better battery life
|
|
||||||
|
|
||||||
FastImage's native libraries are designed for this exact use case - trust them to handle memory efficiently rather than manually clearing cache on every navigation.
|
|
||||||
|
|
||||||
Loading…
Reference in a new issue