체로키 웹 서버의 이미지를 표시하는 앱을 작성하고 싶습니다.Android에서 이미지 미리보기를 표시하는 방법?
@Override
protected Bitmap doInBackground(URL... params) {
URL urlToDownload = params[0];
String downloadFileName = urlToDownload.getFile();
downloadFile = new File(applicationContext.getCacheDir(), downloadFileName);
new File(downloadFile.getParent()).mkdirs(); // create all necessary folders
// download the file if it is not already cached
if (!downloadFile.exists()) {
try {
URLConnection cn = urlToDownload.openConnection();
cn.connect();
cn.setReadTimeout(5000);
cn.setConnectTimeout(5000);
InputStream stream = cn.getInputStream();
FileOutputStream out = new FileOutputStream(downloadFile);
byte buf[] = new byte[16384];
int numread = 0;
do {
numread = stream.read(buf);
if (numread <= 0) break;
out.write(buf, 0, numread);
} while (numread > 0);
out.close();
} catch (FileNotFoundException e) {
MLog.e(e);
} catch (IOException e) {
MLog.e(e);
} catch (Exception e) {
MLog.e(e);
}
}
if (downloadFile.exists()) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 16;
return BitmapFactory.decodeFile(downloadFile.getAbsolutePath(), options);
} else {
return null;
}
}
이 작동하지만, 내가 다운로드해야 이미지가 매우 큰 (메가 바이트)이기 때문에 그것은 아무것도 볼 수있는 사용자까지 약간의 시간이 소요 : 나는 다음과 같은 코드로 이미지를 다운로드 않습니다.
웹 브라우저와 마찬가지로 전체 이미지를로드하는 동안 이미지의 저해상도 미리보기를 표시하려고합니다. 어떻게해야합니까? BitmapFactory는 완전히로드 된 파일이나 스트림을 받아 들일뿐 아니라 디코딩 전에 완전히 다운로드 된 것으로 보입니다.
서버에는 고해상도 이미지 만 있습니다. 다운로드가 완료되기 전에 이미 다운로드 한 이미지의 모든 부분을 보여 주기만하면됩니다. 그렇게하면 사용자가 찾고 있던 그림이 아니라고 즉시 다운로드를 중단 할 수 있습니다.
불행히도 서버를 변경할 수 없습니다. – hin
Android는 프로그레시브 JPEG를 지원하지만 부분적으로 디코딩하도록 디코더를 사용할 수 있는지는 확실하지 않습니다. 가장 가능성있는 방법은 원래의 이미지를 파일에 저장 한 후 write()를 시도하고 비동기 적으로 읽은 후에 시도하는 것입니다. 그렇게하면 프로그레시브 JPEG 인 경우 부분 해독 될 수 있습니다. 그러나 서버 구성 요소를 변경할 수 없기 때문에 스크래핑하는 사이트와 점진적 jpeg를 제공하지 않는 사이트가 있습니다. 아마도 진행률 표시기를 표시하는 것이 더 좋습니다 –