加快使用ASyncTask获取文件的速度

时间:2014-04-22 14:37:40

标签: android performance android-asynctask gzip

我有一个关于加快加载文本文件的问题。可能已经有类似的线程,但很难找到。

我有一个有趣的设置。启动时,应用程序会联系我的服务器以获取最新数据。这基本上是一个长文本文件,包含一些应用程序信息以及最新数据。这非常有效。有一个带有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 个答案:

答案 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 []来分配新的内存,它只会将内存分配一次。

告诉我它是否有效,我对结果感兴趣。