使用RNFetchBlob下载Zip时出现响应未关闭的IllegalStateException异常
解决RNFetchBlob“前序响应未关闭”导致的崩溃问题
问题原因
该错误源于RNFetchBlob的响应对象未被正确关闭,当重复发起请求时,未释放的前序响应会阻塞新请求,触发Java层的IllegalStateException。
解决方案
1. 使用响应后手动关闭资源
不要直接返回RNFetchBlob的完整响应对象,提取所需信息后立即调用response.close()释放底层网络资源:
const downloadFile = async () => { const dirs = RNFetchBlob.fs.dirs; const filePath = dirs.DownloadDir + '/files/icons.zip'; const response = await RNFetchBlob.config({ fileCache: true, appendExt: 'zip', path: filePath, addAndroidDownloads: { title: 'Icons.zip', description: 'Downloading icons zip file', useDownloadManager: false, notification: false, }, }).fetch('GET', BASE_URL + 'iconos'); const responsePath = response.path(); console.log(responsePath); console.log(response); // 关键:手动关闭响应释放资源 response.close(); // 返回必要数据而非完整响应对象 return { path: responsePath }; };
2. 阻止重复发起请求
在Redux的action中添加请求状态校验,避免用户重复操作触发多次请求:
export const getIcons = () => { return async (dispatch, getState) => { // 检查当前是否正在请求,避免重复触发 const { isFetching } = getState().iconReducer; // 替换为你的实际reducer名称 if (isFetching) return; dispatch(fetching()); try { const response = await checkPermission(); dispatch(getResponseSuccess(response)); } catch (error) { dispatch(getResponseFailure()); } }; };
3. 简化权限检查逻辑(可选)
确保checkPermission中仅在授权通过后发起一次下载请求,避免分支逻辑导致的重复调用:
const checkPermission = async () => { if (Platform.OS === 'ios') { return await downloadFile(); } try { const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE, { title: '存储权限申请', message: '应用需要存储权限以下载文件', }, ); if (granted === PermissionsAndroid.RESULTS.GRANTED) { console.log('存储权限已授权'); return await downloadFile(); } else { Alert.alert('错误', '存储权限未授权'); throw new Error('Storage permission denied'); } } catch (err) { console.log('权限校验异常:', err); throw err; } };
内容的提问来源于stack exchange,提问作者Julian Franco
相关产品推荐
相关产品推荐

