在主UI中保存文件

时间:2013-11-25 08:21:42

标签: android file bitmap

我编写了一个将文件保存到外部存储器的函数:

public void saveBmp(Bitmap bmp) {
    File f = new File(Environment.getExternalStorageDirectory(), "test.jpg");
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(f);
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    }
    bmp.compress(CompressFormat.JPEG, 70, fos);
    try {
        fos.flush();
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    bmp.recycle();
}

为什么android没有警告我,我在主UI中使用文件系统。 是正确的方式还是我需要使用asynctask?

2 个答案:

答案 0 :(得分:3)

根据developer.android.com

*

  

BitmapFactory.decode *方法,在Load Large Bitmaps中讨论   有效的教训,不应该在主UI线程上执行if   源数据是从磁盘或网络位置(或实际上是任何一个)读取的   内存以外的来源)。此数据加载的时间是   不可预测,取决于各种因素(阅读速度   来自磁盘或网络,图像大小,CPU功率等)。如果其中之一   这些任务会阻止UI线程,系统会将您的应用程序标记为   没有响应,用户可以选择关闭它(参见   设计响应更多信息)。

*

所以它的建议是你不应该通过将文件写入外部存储来阻止主UI线程。 强烈建议您使用AsyncTask

答案 1 :(得分:1)

您可以创建类似的东西。但我建议你在AsyncTask中创建和写入文件,因为如果在文件中写入太多数据会花费你很多秒,在这几秒钟内用户将无法对你的应用做任何事情因为主线程(UI线程)用于写入。现在,这取决于您的应用程序设计方式。也许你不想让用户在创建文件时做任何其他事情,但即便如此我也会说你可以在AsyncTask中进行写作,而在写完之后你可以显示一个加载gif,或者其他东西通知用户正在进行保存。