Быстрая загрузка растровых изображений - PullRequest
0 голосов
/ 04 июня 2011

Согласно этой ссылке ниже:

http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/

Вы можете ускорить загрузку растровых изображений (или любых файлов), если выполняете буферизацию самостоятельно (то есть вместо использования BufferedInputStream,вы сами справляетесь с буферизацией).

В частности, подход 4 выглядит многообещающе (выплескивая весь файл за раз).Тем не менее, я понятия не имею, как реализовать это в Android.Вот код Java:

import java.io.*;

public class readfile {
 public static void main(String args[]) {
  if (args.length != 1) {
    System.err.println("missing filename");
    System.exit(1);
  }
  try {
    int len = (int)(new File(args[0]).length());
    FileInputStream fis =
        new FileInputStream(args[0]);
    byte buf[] = new byte[len];
    fis.read(buf);
    fis.close();
    int cnt = 0;
    for (int i = 0; i < len; i++) {
      if (buf[i] == '\n')
        cnt++;
    }
    System.out.println(cnt);
  }
  catch (IOException e) {
    System.err.println(e);
  }
 }

}

1 Ответ

0 голосов
/ 04 июня 2011

Этот метод не оптимизирован для Android и, вероятно, будет работать плохо.Соглашение заключается в использовании AndroidHttpClient :

подкласса Apache DefaultHttpClient, который настроен с разумными настройками по умолчанию и зарегистрированными схемами для Android, а также позволяет пользователю добавлять классы HttpRequestInterceptor.

Если вы действительно хотите использовать приведенный выше код Sun, будьте осторожны, так как вы, вероятно, превысите бюджет кучи виртуальной машины, когда размер файла превысит объем кучи, доступный для приложения.

Было бы целесообразно сначала проверить, осталось ли достаточно кучи, используя ActivityManager .См. Также подробный ответ на этот вопрос .

Редактировать:

Я нашел пример отправкиInputStream через POST.Здесь файл читается из ресурса (res/data.xml), но вы можете заменить InputStream на FileInputStream из своего фрагмента.Преобразование InputStream в байтовый массив, по сути, аналогично вашему коду: считайте весь файл в память и вставьте его в запрос.Это печально известная причина OutOfMemoryError с, поэтому позаботьтесь о том, чтобы вы не читали файлы слишком большого размера (я бы рекомендовал менее 1 МБ).

public void executeMultipartPost() throws Exception {
    try {
        InputStream is = this.getAssets().open("data.xml");
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost postRequest = new HttpPost("http://w3mentor.com/Upload.aspx");
        byte[] data = IOUtils.toByteArray(is);
        InputStreamBody isb = new InputStreamBody(new ByteArrayInputStream(data),"uploadedFile");
        StringBody sb1 = new StringBody("someTextGoesHere");
        StringBody sb2 = new StringBody("someTextGoesHere too");
        MultipartEntity multipartContent = new MultipartEntity();
        multipartContent.addPart("uploadedFile", isb);
        multipartContent.addPart("one", sb1);
        multipartContent.addPart("two", sb2);
        postRequest.setEntity(multipartContent);
        HttpResponse res = httpClient.execute(postRequest);
        res.getEntity().getContent().close();
    } catch (Throwable e) {
        // handle exception here
    }
}
...