You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:36:26