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

如何正确关闭JGit以彻底释放所有网络连接?

问题描述

在Android 7.1.2环境下使用org.eclipse.jgit:3.7.1.201504261725-r版本,通过以下代码创建JGit的Git实例:

repo = FileRepositoryBuilder()
    .setGitDir(File(gitDir))
    .findGitDir()
    .build()
...
repo.create()
...
git = Git(repo)

执行拉取操作:

git.pull().setCredentialsProvider(auth).call()

关闭时执行:

git.close()
repo?.close()

问题:执行拉取后Android Profiler显示仍有连接保持打开,每约5秒发送少量数据,且每次拉取后未关闭的连接数量会增加,需要实现调用git.close()时立即关闭所有连接。


解决方案

1. 显式清理传输层资源

JGit的Pull操作依赖Transport实例完成网络交互,旧版本中PullCommand可能不会自动关闭所有关联的Transport资源,可手动获取并关闭:

val pullCommand = git.pull().setCredentialsProvider(auth)
pullCommand.call()
// 显式关闭关联的Transport
val transport = pullCommand.transport
transport?.close()

2. 手动关闭HTTP连接池

JGit通过HttpClient处理HTTP/HTTPS请求,旧版本的连接池不会随Git实例关闭自动销毁,需手动清理:

import org.eclipse.jgit.transport.TransportHttp
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager

// 关闭Git和仓库后,清理HTTP连接池
val connManager = TransportHttp.getConnectionManager()
if (connManager is PoolingHttpClientConnectionManager) {
    connManager.shutdown()
}

3. 升级JGit版本

3.7.1.201504261725-r是2015年的旧版本,存在不少资源泄漏的已知问题,后续稳定版本(如5.x、6.x系列)已修复大量此类bug。建议升级到兼容Android的新版本,比如org.eclipse.jgit:6.7.0.202309050840-r(需确认与Android 7.1.2的兼容性),新版本中git.close()会更彻底地清理所有关联资源。

4. 调整资源关闭顺序

确保先清理拉取命令相关资源,再关闭Git实例,最后关闭仓库:

// 先清理PullCommand关联的Transport
pullCommand.transport?.close()
// 关闭Git实例
git.close()
// 关闭仓库
repo?.close()

内容的提问来源于stack exchange,提问作者Iria Somobu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:39:17