android应用第一次启动加载大数据导致启动速度慢解决办法
2016-11-29 13:33
465 查看
在Android中导入静态数据库很简单,首先将准备好的静态数据库文件放到Android工程的res目录中的raw子目录下面,如果没有这个子目录的话就手动创建该目录,然后在应用的初始化阶段通过类似下面的代码将数据库文件拷贝到特定的目录下面,假设Android应用的包名是com.test,那么大部分情况下该应用默认的数据库文件位于/data/data/com.test/databases目录下面。
Stri 4000 ng dbDirPath = "/data/data/com.test/databases"; File dbDir = new File(dbDirPath); if(!dbDir.exists()) // 如果不存在该目录则创建 dbDir.mkdir(); // 打开静态数据库文件的输入流 InputStream is = context.getResources().openRawResource(R.raw.data); // 打开目标数据库文件的输出流 FileOutputStream os = new FileOutputStream(dbDirPath+"/data.db"); byte[] buffer = new byte[1024]; int count = 0; // 将静态数据库文件拷贝到目的地 while ((count = is.read(buffer)) > 0) { os.write(buffer, 0, count); } is.close(); os.close();
以最近完成的一个应用来看,采用导入静态数据库的方式后,第一次启动时间从将近4秒变成了1秒,效果还是很明显的。
不过,这种方式是假定所有Android设备的应用安装目录是相同的,而且数据库文件的目录都是/data/data/包名/databases,但是Android的文档中并没有明确规定所有设备具有此种目录结构,所以将静态数据库文件拷贝到一个事先定死的目录的做法还是有一定危险性的。更好的做法是使用Android系统提供的API去解决这个问题,总之,我们要避免的就是使用固定目录,下面是更好的拷贝过程:
// 打开静态数据库文件的输入流 InputStream is = context.getResources().openRawResource(R.raw.data); // 通过Context类来打开目标数据库文件的输出流,这样可以避免将路径写死。 FileOutputStream os = context.openFileInput("data.db"); byte[] buffer = new byte[1024]; int count = 0; // 将静态数据库文件拷贝到目的地 while ((count = is.read(buffer)) > 0) { os.write(buffer, 0, count); } is.close(); os.close();
最终的数据库文件将位于/data/data/com.data/files目录下,需要注意的是,使用Context类的openOrCreateDatabase方法或者SQLiteOpenHelper工具类时,不能再传递数据库的名称作为参数,而是要把数据库文件的全路经传递给它们。
相关文章推荐
- Android在一个应用中启动另一个应用的Activity时失败的解决办法
- 在Android中通过导入静态数据库来提高应用第一次的启动速度
- Android应用第一次安装成功点击“打开”后Home键切出应用后再点击桌面图标返回导致应用重启问题的解决方法
- Android listview加载数据后没有立即刷新的解决办法
- Android环境搭建Android Studio的第一次无法启动解决办法
- Android应用启动时白色闪屏原因及解决办法
- Android webview旋转屏幕导致页面重新加载问题解决办法
- WPF的DataGrid绑定ItemsSource后第一次加载数据有个别列移位的解决办法
- 在Android中通过导入静态数据库来提高应用第一次的启动速度
- android图片加载导致的OOM分析及有效解决办法(BitmapUtils)
- 在Android中通过导入静态数据库来提高应用第一次的启动速度
- Android应用共享数据被回收解决办法
- oracle数据文件强制删除导致无法启动的解决办法
- Android不同方式启动导致重复启动相同的Activity的问题解决办法(转载,解决了我的问题)
- 用oralce连接.net客户端出现问题:“数据连接不成功,请检查该数据库是否已启动尝试加载oracle客户端时引发BadImageFormatException.如果在安装32位Oracle客户端组件的情况下以64位模式运行,”的解决办法
- Rabbitmq由于queen数据持久化错误,导致无法启动的解决办法
- Android文件系统破坏,导致系统无法启动解决办法
- Android—Socket中关闭IO流后导致Socket关闭不能再收发数据的解决办法
- Android 调用系统相机拍照,生命周期重走OnCreate,导致无数据的解决办法
- Android中通过导入静态数据库来提高应用第一次的启动速度