Я пишу приложение, которое требует, чтобы изображения загружались с 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
, так как кубики килобайта становятся доступными с использованием очереди кусков. Связывание кода чтения и кода записи кажется неуклюжим, и они наверняка замедлят друг друга.
Во-вторых, будет ли изменение размера буфера повлиять на скорость передачи данных вообще? Килобайт кажется небольшим, но, возможно, в мобильной связи это не так уж и мало. Затем, чем больше фрагмент, тем больше ожидание от каждого раздела цикла чтения/записи. Нужно ли использовать буфер разного размера?
Я все равно поиграю с ним, но спасибо за отзыв :) –