Fetch는 간단하고 강력하며 사용자 정의가 가능한 Android용 파일 다운로드 관리자 라이브러리입니다.
간단하고 사용하기 쉬운 API.
백그라운드에서 계속 다운로드됩니다.
동시 다운로드 지원.
다운로드를 일시 중지하고 재개하는 기능.
다운로드 우선순위를 설정하세요.
네트워크별 다운로드 지원.
실패한 다운로드를 다시 시도하는 기능.
다운로드를 그룹화하는 기능.
진행 상황 및 상태 추적이 쉽습니다.
남은 시간 보고(ETA)를 다운로드하세요.
속도 보고를 다운로드하세요.
언제든지 다운로드 정보를 저장하고 검색할 수 있습니다.
알림 지원.
저장소 액세스 프레임워크, 콘텐츠 제공자 및 URI 지원.
그리고 더...
애플리케이션 샌드박스 외부에 다운로드를 저장하는 경우 애플리케이션 매니페스트에 다음 저장소 권한을 추가해야 합니다. Android SDK 버전 23(M) 이상의 경우 사용자에게 이러한 권한을 명시적으로 요청해야 합니다.
또한 인터넷을 사용하여 파일을 다운로드할 예정입니다. 매니페스트에 인터넷 액세스 권한을 추가해야 합니다.
Fetch를 사용하는 것은 쉽습니다! 애플리케이션의 build.gradle 파일에 Gradle 종속성을 추가하기만 하면 됩니다.
구현 "com.tonyodev.fetch2:fetch2:3.0.12"
Androidx 사용:
구현 "androidx.tonyodev.fetch2:xfetch2:3.1.6"
다음으로 Fetch 인스턴스를 가져와 다운로드를 요청하세요.
공개 클래스 TestActivity는 AppCompatActivity를 확장합니다. { private Fetch fetch; @Override protected void onCreate(@Nullable Bundle selectedInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this) .setDownloadConcurrentLimit(3) .짓다(); fetch = Fetch.Impl.getInstance(fetchConfiguration); 문자열 url = "http:www.example.com/test.txt"; 문자열 파일 = "/downloads/test.txt"; 최종 요청 요청 = 새로운 요청(url, file); request.setPriority(Priority.HIGH); request.setNetworkType(NetworkType.ALL); request.addHeader("clientKey", "SD78DF93_3947&MVNGHE1WONG"); fetch.enqueue(request, updateRequest -> { //요청이 다운로드 대기열에 성공적으로 추가되었습니다. }, error -> { //요청을 대기열에 넣는 동안 오류가 발생했습니다. }); } }
Fetch를 사용하면 다운로드 진행 상황과 상태를 추적하는 것이 매우 쉽습니다. FetchListener를 Fetch 인스턴스에 추가하기만 하면 다운로드 상태나 진행 상황이 변경될 때마다 리스너에게 알림이 전송됩니다.
FetchListener fetchListener = new FetchListener() { @Override public void onQueued(@NotNull Download download, boolean waitOnNetwork) { if (request.getId() == download.getId()) { showDownloadInList(download); } } @Override public void onCompleted(@NotNull 다운로드 다운로드) { } @Override public void onError(@NotNull Download download) { 오류 오류 = download.getError(); } @Override public void onProgress(@NotNull 다운로드 다운로드, 긴 etaInMilliSeconds, 긴 downloadBytesPerSecond) { if (request.getId() == download.getId()) { updateDownload(download, etaInMilliSeconds); } int 진행 = download.getProgress(); } @Override public void onPaused(@NotNull 다운로드 다운로드) { } @Override public void onResumed(@NotNull 다운로드 다운로드) { } @Override public void onCancelled(@NotNull 다운로드 다운로드) { } @Override public void onRemoved(@NotNull 다운로드 다운로드) { } @Override public void onDeleted(@NotNull 다운로드 다운로드) { } };fetch.addListener(fetchListener);//완료 시 리스너 제거.fetch.removeListener(fetchListener);
Fetch는 요청 ID를 사용하여 다운로드 일시 중지 및 재개를 지원합니다. 요청 ID는 요청을 Fetch Download에 매핑하는 고유 식별자입니다. Fetch에서 반환된 다운로드에는 다운로드를 시작한 요청 ID와 일치하는 ID가 있습니다.
요청 request1 = 새 Request(url, 파일);요청 request2 = 새 Request(url2, file2);fetch.pause(request1.getId()); ...fetch.resume(request2.getId());
여러 가지 방법으로 Fetch에서 다운로드 정보를 쿼리할 수 있습니다.
//모든 downloadsfetch.getDownloads(new Func>() { @Override public void call(List 확장 다운로드> 다운로드) { //여기에서 모든 다운로드에 액세스 } });//statusfetch.getDownloadsWithStatus(Status.DOWNLOADING, new Func
>() { @Override public void call(List downloads) { //다운로드에 액세스하여 모든 다운로드 가져오기 다운로드 중인 } });// 그룹화된 다운로드에 액세스할 수도 있습니다sint groupId = 52687447745;fetch.getDownloadsInGroup(groupId, new Func
>() { @Override public void call(List downloads) { / /그룹화된 다운로드에 액세스 } });
Fetch 인스턴스가 완료되면 간단히 해제하면 됩니다.
//workfetch.close() 수행;//추가 작업 수행
기본적으로 Fetch는 HttpUrlConnectionDownloader를 통해 HttpUrlConnection 클라이언트를 사용하여 요청을 다운로드합니다. 대신 OkHttp 다운로더를 사용하려면 애플리케이션의 build.gradle에 다음 Gradle 종속성을 추가하세요. 필요한 경우 사용자 정의 다운로더를 만들 수 있습니다. 자세한 내용은 Java 문서를 참조하세요.
구현 "com.tonyodev.fetch2okhttp:fetch2okhttp:3.0.12"
Androidx 사용:
구현 "androidx.tonyodev.fetch2okhttp:xfetch2okhttp:3.1.6"
사용할 Fetch용 OkHttp 다운로더를 설정합니다.
OkHttpClient okHttpClient = 새로운 OkHttpClient.Builder().build();FetchConfiguration fetchConfiguration = 새로운 FetchConfiguration.Builder(this) .setDownloadConcurrentLimit(10) .setHttpDownloader(새로운 OkHttpDownloader(okHttpClient)) .build();Fetch fetch = Fetch.Impl.getInstance(fetchConfiguration);
Fetch를 사용할 때 RxJava2 기능을 활용하려면 애플리케이션의 build.gradle 파일에 다음 Gradle 종속성을 추가하세요.
구현 "com.tonyodev.fetch2rx:fetch2rx:3.0.12"
Androidx 사용:
구현 "androidx.tonyodev.fetch2rx:xfetch2rx:3.1.6"
RxFetch를 사용하면 rxJava2 기능 메서드를 사용하여 다운로드 요청을 대기열에 추가하고 다운로드를 쿼리하는 것이 매우 쉽습니다.
FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this).build();Rxfetch rxFetch = RxFetch.Impl.getInstance(fetchConfiguration);rxFetch.getDownloads() .asFlowable() .subscribe(new Consumer>() { @Override public void accept(List
downloads) throws Exception { //결과 액세스 } }, new Consumer () { @Override public void accept(Throwable throwable) throws Exception { //오류가 발생했습니다. final Error error = FetchErrorUtils.getErrorFromThrowable(throwable); } });
FetchFileServer를 소개합니다. FetchFileServer는 Android 기기 간에 파일을 공유하도록 특별히 설계된 HTTP 파일 서버처럼 작동하는 경량 TCP 파일 서버입니다. 한 장치에서 FetchFileServer를 사용하여 파일 리소스를 호스팅할 수 있으며 다른 장치의 서버에서 다운로드 파일을 가져와야 합니다. 자세한 내용은 샘플 앱을 참조하세요. FetchFileServer의 Wiki는 앞으로 추가될 예정입니다.
애플리케이션의 build.gradle 파일에 Gradle 종속성을 추가하여 FetchFileServer 사용을 시작하세요.
구현 "com.tonyodev.fetch2fileserver:fetch2fileserver:3.0.12"
Androidx 사용:
구현 "androidx.tonyodev.fetch2fileserver:xfetch2fileserver:3.1.6"
FetchFileServer 인스턴스를 시작하고 연결된 클라이언트에 제공할 수 있는 리소스 파일을 추가합니다.
공개 클래스 TestActivity는 AppCompatActivity { FetchFileServer fetchFileServer를 확장합니다. @Override protected void onCreate(@Nullable Bundle selectedInstanceState) { super.onCreate(savedInstanceState); fetchFileServer = 새로운 FetchFileServer.Builder(this) .짓다(); fetchFileServer.start(); //클라이언트 연결 수신 File file = new File("/downloads/testfile.txt"); FileResource fileResource = 새로운 FileResource(); fileResource.setFile(file.getAbsolutePath()); fileResource.setLength(file.length()); fileResource.setName("testfile.txt"); fileResource.setId(UUID.randomUUID().hashCode()); fetchFileServer.addFileResource(fileResource); } @Override protected void onDestroy() { super.onDestroy(); fetchFileServer.shutDown(false); } }
Fetch를 사용하여 FetchFileServer에서 파일을 다운로드하는 것은 쉽습니다.
공개 클래스 TestActivity는 AppCompatActivity를 확장합니다. { Fetch fetch; @Override protected void onCreate(@Nullable Bundle selectedInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = 새로운 FetchConfiguration.Builder(this) .setFileServerDownloader(new FetchFileServerDownloader()) //파일 서버 다운로더를 설정해야 합니다. .짓다(); fetch = Fetch.Impl.getInstance(fetchConfiguration); fetch.addListener(fetchListener); 문자열 파일 = "/downloads/sample.txt"; 문자열 url = 새로운 FetchFileServerUrlBuilder() .setHostInetAddress("127.0.0.1", 6886) //파일 서버 IP 및 포트 .setFileResourceIdentifier("testfile.txt") //파일 리소스 이름 또는 ID .만들다(); 요청 요청 = new Request(url, file); fetch.enqueue(request, request1 -> { //다운로드 대기열에 요청이 추가되었습니다. }, error -> { //다운로드 대기열에 넣는 중 오류가 발생했습니다. }); } @Override protected void onResume() { super.onResume(); fetch.addListener(fetchListener); } @Override protected void onPause() { super.onPause(); fetch.removeListener(fetchListener); } @Override protected void onDestroy() { super.onDestroy(); fetch.close(); } private FetchListener fetchListener = new AbstractFetchListener() { @Override public void onProgress(@NotNull 다운로드 다운로드, 긴 etaInMilliSeconds, 긴 downloadBytesPerSecond) { super.onProgress(다운로드, etaInMilliSeconds, downloadBytesPerSecond); Log.d("TestActivity", "진행률: " + download.getProgress()); } @Override public void onError(@NotNull 다운로드 다운로드) { super.onError(다운로드); Log.d("TestActivity", "오류: " + download.getError().toString()); } @Override public void onCompleted(@NotNull 다운로드 다운로드) { super.onCompleted(다운로드); Log.d("TestActivity", "완료됨"); } }; }
마이그레이션 지원을 사용하여 다운로드를 Fetch1에서 Fetch2로 마이그레이션합니다. 애플리케이션의 build.gradle 파일에 다음 Gradle 종속성을 추가합니다.
구현 "com.tonyodev.fetchmigrator:fetchmigrator:3.0.12"
Androidx 사용:
구현 "androidx.tonyodev.fetchmigrator:xfetchmigrator:3.1.6"
그런 다음 Migrator를 실행하십시오.
if (!didMigrationRun()) { //마이그레이션은 백그라운드 스레드에서 실행되어야 합니다 new Thread(new Runnable() { @Override public void run() { try { final ListtransferDownloads = FetchMigrator. migrationFromV1toV2(getApplicationContext() , APP_FETCH_NAMESPACE); //TODO: (DownloadTransferPair transferDownload:)에 대한 ID의 외부 참조를 업데이트합니다. transferDownloads) { Log.d("newDownload", transferDownload.getNewDownload().toString()) Log.d("oldId in Fetch v1", transferDownload.getOldID() + ""); } FetchMigrator.deleteFetchV1Database(getApplicationContext()); setMigrationDidRun(true); //마이그레이션 후 Fetch2 설정 및 실행 } catch (SQLException e) { e.printStackTrace(); } } }).시작(); } else { //Fetch2를 정상적으로 설정하고 실행합니다. }
Fetch는 코드에 기여하는 경우에만 더 좋아질 수 있습니다. 버그를 발견하셨나요? 신고하세요. Fetch에서 보고 싶은 기능 아이디어가 있나요? 프로젝트에 기여하세요!
Copyright (C) 2017 Tonyo Francis. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.