2013-03-25 42 views
0

我在文件中有1000行,每次加载应用程序时都会向用户提供这些行。Android字符串内容加载性能

我目前的做法是:

MainActivity:的onCreate:启动的AsyncTask

的AsyncTask onPreExecute:进度显示dialiog

的AsyncTask doInBackground:检查键/值存在于共享首选项中,如果是,则doInBackground中不做任何事情。如果没有(第一次用户),从原始文件读取并创建一个stringbuilder。将StringBuilder的内容作为键值对存储在sharedpreferences中。

AsyncTask onPostExecute:从sharedpreferences填充textview。关闭进度对话框。

的代码从文件中doInBackground方法读的是:

StringBuilder sb = new StringBuilder(); 
InputStream textStream = getBaseContext().getResources().openRawResource(R.raw.file); 
BufferedReader bReader = new BufferedReader(new InputStreamReader(textStream)); 

String aJsonLine = null; 
try { 
    while ((aJsonLine = bReader.readLine()) != null) { 
     sb.append(aJsonLine + System.getProperty("line.separator")); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally{ 
    try { 
     bReader.close(); 
     textStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

我看到的是,用户必须等待约9-10秒,首次启动和4-5秒以后启动。任何建议,以改善我的情况下的表现。

+0

1000行速度快,不需要异步任务 – 2013-03-25 05:52:08

+0

也取决于网络速度。如果您希望用户与ui进行交互,则可以使用服务。你可以使用robospice。 – Raghunandan 2013-03-25 05:53:01

+0

@matheszabi,如果我不使用异步任务,UI会挂起10秒钟。 – Sandeep 2013-03-25 05:54:47

回答

1

你不需要让用户等待得到加载整个列表中的值。一旦你有足够的数据填充屏幕(10-20项,也许?),填充屏幕列表或任何与你已有的数据,这将使延迟完全不重要。

您可以查看http://developer.android.com/reference/android/content/AsyncTaskLoader.html以了解它应该如何完成。

+0

您的建议看起来很有前途,可以减少获取1000行文本的开销,然后一次性显示1000行文本视图。但我怀疑如何控制不同屏幕密度的线条。例如,如果我想确保1000以内,发布时只显示10行,我如何确保它适用于所有屏幕密度?任何想法都可以彻底解决我的问题。 – Sandeep 2013-03-25 08:57:08

+0

当你使用'AsyncTaskLoader'时,加载器会通知你的'Activity'有新的数据可用,它可能是5个项目,也许是10个,你只需要拿它们并刷新你的视图。那么更多的物品来了。最后屏幕已满,可以上下滚动。所有这一切,而其余的仍在加载,你的用户不必看进度条,他可以立即开始在屏幕上处理项目,也许选择一个并跳到另一个“活动”,中断加载其余的数据。 – lenik 2013-03-25 12:11:48

0

我宁愿通过JsonReader阅读JSON流,并提取我感兴趣的名称值对。字符串连接/垃圾收集是昂贵的操作。现在编写代码的方式,这些操作会减慢任务的速度。代码中效率低下,例如在循环的每次迭代中访问行分隔符System.getProperty("line.separator")

只需使用JSONReader即可获得显着的性能提升。

1

作为一个小副业的其他意见,作为aJsonLine是一个字符串,它是一个更好的主意,通过使用两个附加(与新行一起存储的值),而不是单一的一个:

sb.append(aJsonLine); 
sb.append(System.getProperty("line.separator")); 

代替:

sb.append(aJsonLine + System.getProperty("line.separator")); 

随着以后,无论是aJsonLine和System.getProperty(“line.separator”)的结果)需要被转换到StringBuilder的它们之间的连接前用可发生和最终值作为参数传递。

当然,你也应该缓存的System.getProperty("line.separator"))

+0

谢谢。尽管我在发布这个问题后缓存了line.separator的值,但关于使用单独的append语句的观点很好。 – Sandeep 2013-03-25 08:47:18