2

Я пишу приложение, которое требует, чтобы изображения загружались с Google Диска. В настоящее время я делаю это с помощью следующего кода:Каков самый эффективный способ загрузки образов Google Диска в Android?

protected void downloadFromDrive(Context context) { 
    InputStream input = null; 
    FileOutputStream output = null; 
    try { 
     HttpRequest request = GoogleDriveWorker.get(context) 
     .getDrive() 
     .getRequestFactory() 
     .buildGetRequest(new GenericUrl(getUri())); 
     input = request.execute().getContent(); 
     output = context.openFileOutput(getImageFilename(), Context.MODE_PRIVATE); 
     int bufferSize = 1024; 
     byte[] buffer = new byte[bufferSize]; 
     int len = 0; 
     while ((len = input.read(buffer)) != -1) { 
      output.write(buffer, 0, len); 
     } 
    } catch (UnrecoverableKeyException e) { 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (CertificateException e) { 
     e.printStackTrace(); 
    } catch (KeyStoreException e) { 
     e.printStackTrace(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if(output!=null) 
       output.close(); 
      if(input!=null) 
       input.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public String getUri() { 
    return mUri; 
} 

GoogleDriveWorker просто класс, который получает Google диск с учетными данными, которые мы применяем. В любом случае, большинство примеров, которые я могу найти, используют эту базовую структуру для загрузки файла с InputStream и помещают его в OutputStream, но скорость загрузки довольно низкая.

Во-первых, могу ли я ускорить его с помощью более сложного метода, чем синхронно буферизировать InputStream на OutputStream килобайт за раз? Мне кажется, что я должен попытаться прочитать InputStream в другом потоке и вывести на OutputStream, так как кубики килобайта становятся доступными с использованием очереди кусков. Связывание кода чтения и кода записи кажется неуклюжим, и они наверняка замедлят друг друга.

Во-вторых, будет ли изменение размера буфера повлиять на скорость передачи данных вообще? Килобайт кажется небольшим, но, возможно, в мобильной связи это не так уж и мало. Затем, чем больше фрагмент, тем больше ожидание от каждого раздела цикла чтения/записи. Нужно ли использовать буфер разного размера?

ответ

1

Я не думаю, что существует более сложный метод, чем то, что вы сделали. Возможно, вы могли бы провести эксперименты с большими кусками (например, несколько сотен КБ) и измерить тим. Я думаю, что это было быстрее.

Также проверьте документацию на диск/java-api-client-library о размере куска. Я думаю, что есть некоторые объяснения по этому поводу, но я не уверен в этом на 100%.

+0

Я все равно поиграю с ним, но спасибо за отзыв :) –

 Смежные вопросы

  • Нет связанных вопросов^_^