我有一个关于加快加载文本文件的问题。可能已经有类似的线程,但很难找到。
我有一个有趣的设置。启动时,应用程序会联系我的服务器以获取最新数据。这基本上是一个长文本文件,包含一些应用程序信息以及最新数据。这非常有效。有一个带有ASyncTask的服务可以做到这一点。我已经包含了以下任务的代码。
我在服务器上启用了一些缓存,文件在我的浏览器中加载得非常快。但是,即使在很棒的连接上,我的应用程序也需要更长时间(如30秒以上)。我在我的服务器上启用了GZIP,这使得在浏览器中加载更快(<1秒)。但是,我的应用仍然很慢。考虑到这种情况发生在应用程序的第一次启动时,必须等待这么长时间才是非常糟糕的经历。
我还有什么办法可以从应用程序中加快这个过程吗?
提前致谢
(以下代码)
private class DownloadData extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
String result = "";
try {
// Create a URL for the desired page
URL url = new URL("LINK HERE");
// Read all the text returned by the server
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String str;
while ((str = in.readLine()) != null) {
result += str;
}
in.close();
} catch (MalformedURLException e) {
} catch (IOException e) {
}
return result;
}
@Override
protected void onPostExecute(String result) {
// Result processed here. It takes 30 seconds to reach this point, so no delay is happening here
}
@Override
protected void onPreExecute() {
// Some UI Things
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
答案 0 :(得分:1)
我不确定它是您代码中的最大问题,但您可以尝试通过不使用字符串类而不是char []进行优化。
char[] resultTab=new char[Integer.MAX_VALUE];
int i=0;
while ((resultTab[i] = in.read()) != -1) {
i++;
}
String result = String.copyValueOf(resultTab, 0, i);
代替Integer.MAX_VALUE,您可以放置字符串的长度估计值。 (再多一点,如果你不确定的话)
如果你正在使用一个字符串,你的应用程序必须在文本变大时使用char []来分配新的内存,它只会将内存分配一次。
告诉我它是否有效,我对结果感兴趣。