Android APP 缓存路径

这篇具有很好参考价值的文章主要介绍了Android APP 缓存路径。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Context.getCacheDir():

这个缓存路径打印出来的是:data / data / (APPID ) / cache

Android系统中的清除APP缓存清除的就是这个路径:

Android APP 缓存路径

随着用户手动清空缓存或者APP的卸载,这个路径的缓存也会被删除。

请注意在这个缓存路径上读写是不需要请求文件读写权限的,所以在这个路径上可以做一些不需要请求读写权限的缓存操作(图片等)。


Activity.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath():

这个缓存对应的位置是:sdcard/Android/data/ (APPID ) /files/Download

注:因为是对SD卡进行读写来实现缓存,所以需要请求读写权限才能操作

在Android系统中清除缓存不会删除这个路径的缓存

但会随着APP卸载而删除此路径的缓存


/sdcard/xxx/xxx/xxx.jpg :

注:因为是对SD卡进行读写来实现缓存,所以需要请求读写权限才能操作

如果缓存在这个路径下,在Android系统中清除缓存或卸载APP都无法删除这个缓存。

若开发者不提供删除这个缓存的方法则会一直霸占用户手机的存储空间。


来一个比较简单的例子(缓存图片):

public class MainActivity extends AppCompatActivity {

    private Button btn;
    private ImageView imageView;
    private String cachePath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = findViewById(R.id.button);
        imageView = findViewById(R.id.image);
        cachePath = getCacheDir() + "/kang.jpg";

        if (ImageSaveUtil.hasBitmap(cachePath)) { // 若有缓存,则显示缓存图片
            imageView.setImageBitmap(ImageSaveUtil.getBitmap(cachePath));
        }

        btn.setOnClickListener((v) -> {
            writeToCache();
        });
    }

    private void writeToCache() {
        new Thread() {
            @Override
            public void run() {
                Bitmap imageBitmap = ImageSaveUtil.getImageInputStream("https://img.tukuppt.com/photo-big/00/00/94/6152bc0ce6e5d805.jpg");
                ImageSaveUtil.saveBitmap(imageBitmap, cachePath);
                runOnUiThread(() -> {
                    imageView.setImageBitmap(imageBitmap);
                    Toast.makeText(MainActivity.this, "写入完成", Toast.LENGTH_SHORT).show();
                });
            }
        }.start();
    }
}

/**
 * @author wk
 * @since 2022/10/18
 */
public class ImageSaveUtil {

    /**
     * 保存图片至路径
     * @param bitmap
     * @param path
     */
    public static void saveBitmap(Bitmap bitmap, String path) {
        File filePic;
        if (!Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            Log.d("xxx", "saveBitmap: 1return");
            return;
        }
        try {
            filePic = new File(path);
            if (!filePic.exists()) {
                filePic.getParentFile().mkdirs();
                filePic.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(filePic);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
            Log.d("xxx", "saveBitmap: 2return");
            return;
        }
        Log.d("xxx", "saveBitmap: " + filePic.getAbsolutePath());
    }

    /**
     * 从路径中读取图片
     * @param path
     */
    public static Bitmap getBitmap(String path) {
        try {
            File file = new File(path);
            FileInputStream inputStream = new FileInputStream(file);
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            return bitmap;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 路径是否存在
     */
    public static boolean hasBitmap(String path) {
        File file = new File(path);
        return file.exists();
    }
    
    /**
     * 根据 Url 下载网络图片
     */
    public static Bitmap getImageInputStream(String imageUrl) {
        URL url;
        HttpURLConnection connection;
        Bitmap bitmap = null;
        try {
            url = new URL(imageUrl);
            connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(6000); //超时设置
            connection.setDoInput(true);
            connection.setUseCaches(false); //设置不使用缓存
            InputStream inputStream = connection.getInputStream();
            bitmap = BitmapFactory.decodeStream(inputStream);
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }

}

运行结果:点击按钮后从网络上下载然后做缓存。在重启APP时读取缓存图片然后显示出来。


总结:从缓存的存活周期来选择对应的缓存方法。比如是否能被用户删除,是否一直存在于设备中等方面去考虑文章来源地址https://www.toymoban.com/news/detail-460997.html

到了这里,关于Android APP 缓存路径的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 修改conda缓存路径:详解如何将Anaconda缓存位置更改

    修改conda缓存路径:详解如何将Anaconda缓存位置更改 在使用Anaconda进行Python开发时,我们经常需要使用conda来管理第三方库和环境。但是,使用默认缓存路径时,conda会将下载好的包存储在本地磁盘的默认位置,这可能会导致磁盘空间不足的问题。为了解决这个问题,我们需要

    2024年02月06日
    浏览(53)
  • 修改huggingface的缓存路径

    最近查了一下C盘爆满的原因,发现了huggingface的缓存文件这个罪魁祸首。 每次 远程导入 模型 、 数据集 时,都会启用huggingface的缓存机制,将整个大文件下载至 缓存目录 中,从而保证下一次加载时非常快速。 我们可以发现,默认的缓存目录就是设置在C盘。 下面是更改存放

    2024年02月08日
    浏览(48)
  • vscode - 环境准备 - 修改缓存路径

    在window上使用vscode,其默认的缓存(包含代码缓存,插件等)存储路径是在c盘,即使将vscode安装在其它磁盘。 频繁使用vscode,vscode会占用C盘大量磁盘空间,C盘空间不充裕,会被vscode慢慢吃掉剩余空间。 本文基于version 1.83。 看vscode描述,IntelliSense大致原理是:预编译头文件

    2024年02月07日
    浏览(39)
  • Android 11及以上出现 Intent.resolveActivity(context.getPackageManager()) == null的处理

    1、使用场景: App调用系统相机拍照设置图片。 2、问题描述:  targetSdkVersion = android 11的之后,以下代码captureIntent.resolveActivity(context.getPackageManager()) 直接返回了null。 3、系统环境: Android 11 , targetSdkVersion == 33 4、解决方案: (1)调用系统应用时: 方案1:在清单文件中添加

    2024年02月13日
    浏览(40)
  • 做app的测试,你大概率会用到这个命令,尤其是做monkey测试

    安卓系统是基于Linux系统开发,也就支持常见的Linux的命令,若在window客户端下执行时需要用adb shell 命令 。或者是先输入adb shell 。进入shell程序后,然后执行下面的命令 。 普通命令是指在shell执行的命令和Linux下的命令是一样的 ,比如:ls , cp ,cd ,touch ,mkdir等命令在adb shell下都

    2023年04月08日
    浏览(42)
  • uniapp 图片本地缓存,本地路径离线使用

    功能介绍:uniapp 多张图片本地存储,下载进度条。 目前还差一个删除功能,有机会再加上

    2024年02月16日
    浏览(34)
  • npm改变npm缓存路径和改变环境变量

    在安装nodejs时,系统会自动安装在系统盘C, 时间久了经常会遇到C盘爆满,有时候出现红色,此时才发现很多时候是因为npm 缓存保存在C盘导致的,下面就介绍下如何改变npm缓存路径。 1、首先找到安装nodejs的路径,然后nodejs目录下新建2个文件夹node_cache和node_global 2、打开cm

    2024年02月08日
    浏览(51)
  • Nuget更新全局包、缓存和临时文件夹路径位置

    NuGet是一个流行的软件包管理器,可以帮助.NET开发人员轻松地添加、删除和更新项目中的库和工具。本文将向您介绍如何更改NuGet的全局包、缓存和临时文件夹路径位置,以便根据您的偏好进行自定义配置。 在默认情况下,NuGet将全局包、缓存和临时文件夹存储在特定的目录

    2024年02月12日
    浏览(37)
  • 安卓studio 个人课设项目:“这个app“——实现注册登录,显示用户信息功能,并跳转对应网页

    目录 目录 功能说明  登录页面 注册页面 登录后界面 点击头像出现侧滑界面,并显示用户信息 点击编辑按钮进入信息编辑页面  保存后返回  用户名已更改 跳转网页 相关代码 布局 登录界面  注册界面  信息显示界面  主界面 实现侧滑布局  信息编辑界面 网页显示界面 

    2023年04月26日
    浏览(46)
  • 修改UE4缓存路径,免得太多占用c盘空间

    在安装好了UE4之后,UE4引擎会默认生成缓存路径: C:UsersASUSAppDataLocalUnrealEngineCommon 这里ASUS是我的用户名 如果你忘记了UE4的安装路径,可以通过UE4下载器找到: 点击左侧“设置”, 点击“编辑保管库缓存位置” 默认缓存位置 注意我每个版本需要独自设置缓存位置,比方

    2023年04月10日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包