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

Android Studio:Settings可删TXT订阅数据,PeliculaDetalle类失效

Firebase订阅取消后TXT文件数据删除异常(仅特定Activity出现)

问题详情

我开发的Android应用通过notificaciones.txt文件管理Firebase通知订阅:订阅主题时会把主题写入该文件,取消订阅时需要同时完成Firebase取消操作和TXT文件中对应数据的删除。

目前遇到的矛盾问题:

  • 在AjustesActivity中调用SuscripcionUtil类的取消订阅方法,Firebase取消订阅和TXT数据删除都能正常执行;
  • 在PeliculaDetalleActivity中调用同一个方法,Firebase取消订阅操作正常,但TXT文件里的对应主题数据无法删除;
  • 订阅功能在两个Activity里都能正常工作,会正确把主题写入TXT。

已经尝试过的排查/修复动作:

  • 调整传入SuscripcionUtil的Context对象(试过getApplicationContext()、Activity实例);
  • 重构SuscripcionUtil类,把文件操作逻辑封装成独立方法,确保无状态;
  • 检查文件读写权限(动态权限和Manifest权限都已配置,订阅时能正常写入);
  • 确认两个Activity中传入的主题参数完全一致,无拼写或格式差异。

可能的排查方向与解决方案

1. 统一文件操作的路径

两个Activity中,SuscripcionUtil读取/写入的notificaciones.txt路径可能不一致。比如一个用了应用内部私有目录,另一个误用到外部存储;或者路径拼接时出现大小写、子目录差异。

解决方式:
在SuscripcionUtil中固定文件路径的获取逻辑,所有文件操作都通过这个方法获取文件实例:

public static File getSubscriptionFile(Context context) {
    // 固定使用应用内部私有存储目录
    return new File(context.getFilesDir(), "notificaciones.txt");
}

2. 确保文件操作在子线程执行

如果文件删除操作在主线程执行,可能因IO阻塞导致未完成;或者PeliculaDetalleActivity中存在其他异步任务干扰文件读写。

解决方式:
把所有文件操作(读、写、删)放到子线程执行,示例代码:

private static class DeleteSubscriptionTask extends AsyncTask<Void, Void, Boolean> {
    private final Context appContext;
    private final String targetTopic;

    public DeleteSubscriptionTask(Context context, String topic) {
        this.appContext = context.getApplicationContext();
        this.targetTopic = topic;
    }

    @Override
    protected Boolean doInBackground(Void... voids) {
        File file = getSubscriptionFile(appContext);
        if (!file.exists()) return false;
        
        try {
            // 读取文件内容,过滤目标主题后重新写入
            List<String> topics = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
            boolean isRemoved = topics.remove(targetTopic);
            if (isRemoved) {
                Files.write(file.toPath(), topics, StandardCharsets.UTF_8);
                return true;
            }
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
}

调用时直接启动该任务,避免主线程IO操作。

3. 增加文件操作的日志排查

可能PeliculaDetalleActivity中文件删除时抛出了异常,但代码未捕获或打印日志,导致无法定位问题。

解决方式:
在SuscripcionUtil的文件删除方法中添加详细日志:

public static boolean deleteSubscriptionFromFile(Context context, String topic) {
    File file = getSubscriptionFile(context);
    Log.d("SuscripcionUtil", "操作文件路径:" + file.getAbsolutePath());
    
    if (!file.exists()) {
        Log.e("SuscripcionUtil", "文件不存在");
        return false;
    }
    
    try {
        List<String> topics = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
        Log.d("SuscripcionUtil", "当前文件内容:" + topics.toString());
        boolean removed = topics.remove(topic);
        Log.d("SuscripcionUtil", "是否找到目标主题:" + removed);
        
        if (removed) {
            Files.write(file.toPath(), topics, StandardCharsets.UTF_8);
            Log.d("SuscripcionUtil", "文件更新成功");
            return true;
        }
        return false;
    } catch (IOException e) {
        Log.e("SuscripcionUtil", "文件操作异常", e);
        return false;
    }
}

调用后查看Logcat日志,确认是文件不存在、主题未找到还是IO异常导致的问题。

4. 规避Activity生命周期干扰

如果PeliculaDetalleActivity在文件操作完成前就被销毁(比如用户快速返回),可能导致文件写入未完成。

解决方式:

  • 把SuscripcionUtil的操作逻辑绑定到ViewModel,让任务在ViewModel的生命周期内执行,不受Activity销毁影响;
  • 调用文件操作前,检查Activity是否处于活跃状态:
if (!isFinishing() && !isDestroyed()) {
    SuscripcionUtil.deleteSubscription(this, targetTopic);
}

内容的提问来源于stack exchange,提问作者Joan Casal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:50:11