2014-04-22 19 views
0

我有一个关于加速文本文件加载的问题。可能有类似的线索,但很难找到。加速使用ASyncTask获取文件

我有一个有趣的设置。启动时,应用程序会联系我的服务器以获取最新数据。这基本上是一个长文本文件,其中包含一些应用程序信息以及最新的数据。这工作得很好。有一个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) { 
      } 
    } 
+1

This while循环让你的下载速度变慢:'while((str = in.readLine())!= null){ result + = str; }'通过应用'byte [] buffer = new byte [1024];'并读取尽可能多的字节,将解决这个问题。相应地调整缓冲区大小 –

+0

有趣的是,我会尽快尝试。如果这能解决它,我会让你知道,这样我就可以将答案标记为已完成。谢谢参观。 –

回答

1

我不知道它这是在你的代码的最大问题,但你可以尝试通过不使用string类,但焦炭优化[]。

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 [],它只会分配一次内存。

告诉我,如果它的工作,我感兴趣的结果。

+0

感谢您解释什么和为什么。将在一小时内测试结果。只是为了我的信息,如果文件长度是可变的,它会工作,还是会在指定数量的字符后停止工作? –

+0

是的,当你有超过10000个字符时它会停止工作。然而,如果你把大量的字符(比如Integer.MAXVALUE和Integer.MAXVALUE是一个大数字,我认为你的字符串不是那么大),我不认为这会是一个大问题。) –

+0

干杯,但它似乎崩溃(虽然它做得很快,所以有这样的:D) 这里是我的实现:http://pastebin.com/qnxxk0Ff 这里是logcat:http://pastebin.com/0mRxu0fi 当我将'MAXVALUE'改为确切的字符数(+1)时(在本例中为612K),似乎是相同的。 –