일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- NDK
- android push
- 코틀린
- kodility
- Django REST Android
- android architecture component
- Java
- FLUTTER
- 안드로이드
- Android P
- RxAndroid
- C++
- 프로그래머스
- C
- RxJava
- 안드로이드 구글맵
- 알고리즘
- flutter firestore
- UWP
- Android
- mfc
- Django REST framework
- C/C++
- dart
- Kotlin
- livedata
- Django REST
- Rxjava2
- Flutter TextField
- Python
- Today
- Total
개발하는 두더지
[Android/안드로이드] InputStream, OutputStream을 활용한 동영상 다운로드 및 재생 본문
목차
1. InputStream, OutputStream에 대해 알아보기
2. AsyncTask 동작 방법에 대해 알아보기
결과물
1. 소켓 통신으로 서버와 클라이언트 간 데이터 통신에 이해
2. AsyncTask 비 동기식 Thread의 사용 방법과 이해
InputStream
Most clients will use input streams that read data from the file system (FileInputStream
), the network (getInputStream()
/getInputStream()
), or from an in-memory byte array (ByteArrayInputStream
).
Most clients should wrap their input stream with BufferedInputStream
public int read (byte[] buffer, int byteOffset, int byteCount)
Reads up to byteCount
bytes from this stream and stores them in the byte array buffer
starting at byteOffset
// URL 객체를 생성
URL url = new URL(UrlString);
// URL에 연결된 객체를 생성
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// 연결된 URL 에서 데이터를 얻어와서 버퍼스트림에 넣어줌
BufferedInputStream br = new BufferedInputStream( conn.getInputStream() );
// 바이트 배열 생성
byte[] data = new byte[4096];
// 스트림에서 바이트 배열 크기만큼 데이터를 읽어서 byte 객체에 저장. 데이터를 끝까지 받을 때 까지 이 과정을 반복
while( (bytesRead = br.read(data, 0, data.length)) >= 0)
OutputStream
FileOutputStream
), the network (getOutputStream()
/getOutputStream()
), or to an in-memory byte array (ByteArrayOutputStream
).BufferedOutputStream
public void write (byte[] buffer, int offset, int count)
count
bytes from the byte array buffer
starting at position offset
to this stream// 파일을 생성해주고 데이터를 쓸 수 있는 아웃풋스트림 객체 생성
String FullPath = "/sdcard/Sample1/test.mp4";
OutputStream output = new FileOutputStream(FullPath);
// 0 위치부터 bytesRead 크기 만큼 data에서 데이터를 빼와서 output이 가리키고 있는 대상에 데이터를 써줌.
// 지금 예제에서는 mp4 파일에 데이터를 써준다.
output.write(data, 0, bytesRead);
AsyncTask
doInBackground(Params...)
), and most often will override a second one (onPostExecute(Result)
.)private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
new DownloadFilesTask().execute(url1, url2, url3);
onPreExecute()
, invoked on the UI thread before the task is executeddoInBackground(Params...)
, invoked on the background thread immediately afteronPreExecute()
finishes executing.onProgressUpdate(Progress...)
, invoked on the UI thread after a call topublishProgress(Progress...)
.onPostExecute(Result)
, invoked on the UI thread after the background computation finishes
Threading rules
There are a few threading rules that must be followed for this class to work properly:
- The AsyncTask class must be loaded on the UI thread. This is done automatically as of
JELLY_BEAN
. - The task instance must be created on the UI thread.
execute(Params...)
must be invoked on the UI thread.- Do not call
onPreExecute()
,onPostExecute(Result)
,doInBackground(Params...)
,onProgressUpdate(Progress...)
manually. - The task can be executed only once (an exception will be thrown if a second execution is attempted.)
Memory observability
AsyncTask guarantees that all callback calls are synchronized in such a way that the following operations are safe without explicit synchronizations.
- Set member fields in the constructor or
onPreExecute()
, and refer to them indoInBackground(Params...)
. - Set member fields in
doInBackground(Params...)
, and refer to them inonProgressUpdate(Progress...)
andonPostExecute(Result)
.
'Java,Android' 카테고리의 다른 글
[Android/안드로이드/자바] Thread, Runnable, Handler 에 대해 알아보기 (0) | 2016.07.22 |
---|---|
[Android/안드로이드] 안드로이드 파일 탐색기 구현 (2) | 2016.07.22 |
[Android/안드로이드] sdcard 절대 경로 찾기 - JellyBean(젤리빈) 이상부터 내장 메모리의 변동, galaxy S3, S4 sdcard 문제 (0) | 2016.07.22 |
[Android/안드로이드] 안드로이드 Context란? 기능과 사용 방법 (1) | 2016.07.22 |
[Android/안드로이드] 안드로이드 해상도 구하기 및 화면 중앙 표시 (0) | 2016.07.22 |