如何正确关闭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
相关产品推荐
相关产品推荐

