1

我想加载一个模型文件,该文件将出现在用户的外部存储中。模型文件的大小可以达到 20MB 左右。它包含由 '\n' 分隔的 x,y,z 信息。当我尝试通过我的方法加载一个小文件时,它运行良好。但是对于大文件,应用程序要求强制退出。

File dir = Environment.getExternalStorageDirectory();
        File file = new File(dir,"model_Cube.txt");
        BufferedReader reader = null;
        List<Float> list = new ArrayList<Float>();

        try {
            reader = new BufferedReader(new FileReader(file));
            String text = null;
            while ((text = reader.readLine()) != null) {
                list.add(Float.parseFloat(text));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
        try {
            reader.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            reader.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        triangleCoords = new float[list.size()];

        for (int i = 0; i < list.size(); i++) {
            Float f = list.get(i);
            triangleCoords[i] = (float) (f.floatValue()/10.0); // Or whatever default you want.
        }
4

2 回答 2

7

这里的问题不在你的代码中,它实际上是线程的问题。

发生这种情况是因为设备看到您正在主用户界面线程中执行大型进程。查看异步任务。 http://developer.android.com/reference/android/os/AsyncTask.html

这就是 Android 在应用程序中处理多线程的方式。在主线程中执行大文件加载或计算可能会导致应用程序无响应,操作系统会认为它已经崩溃。

将此功能拆分为单独的线程将避免该问题。

这是一个不错的教程,其中包含异步任务的示例实现。 http://androidresearch.wordpress.com/2012/03/17/understanding-asynctask-once-and-forever/

于 2013-06-15T05:41:39.053 回答
3

您应该使用 AsyncTask ( http://developer.android.com/reference/android/os/AsyncTask.html ) 或单独的线程 ( http://developer.android.com/reference/java/lang/Thread.html )读这个文件。现在您正在主线程(UI 线程)中读取此文件,并且在读取时,UI 没有响应。另外,请注意,使用 SQLite 而不是这样的大文件可能会更好。

于 2013-06-15T05:41:05.253 回答