나는 활동이 있고 두 개의 목록보기가 있습니다. 첫 번째 목록보기에는 음악이 있습니다. 두 번째 목록보기는 다운로드 항목을 표시하고 각 다운로드 항목은 다운로드 비율에 대한 진행률 표시 줄을 표시합니다. 사용자가 음악 항목을 클릭하면 두 번째 목록보기에 다운로드 항목을 추가하고 AsyncTask로 파일 다운로드를 시작합니다. 사용자는 하나 이상의 음악을 클릭 할 수 있으며 이는 여러 파일을 동시에 다운로드하는 것을 의미합니다. AsyncTask로 파일을 다운로드 할 수 있습니다. 하지만 서비스중인 파일을 다운로드하고 싶은데 앱을 닫아도 다운로드가 계속되어야하기 때문입니다.
서비스와 동시에 여러 파일을 다운로드 할 수있는 방법을 모르겠습니다. 어떤 단계를 따라야합니까? 이것에 대한 튜토리얼이 있습니까?
내 프로덕션 앱 중 하나에서 동일하게 구현했습니다.
IntentService
응용 프로그램이 닫혀 있어도 백그라운드에서 데이터를 다운로드 할 책임이있는을 만듭니다 . 이것은 Service
테이블 큐가 비어 있지 않을 때까지 계속 실행되어야합니다. 새 항목이 추가되거나 네트워크 연결 상태가 dead에서 live로 변경 될 때만 시작해야합니다. 이 안에서 Service
큐가 비어 있는지 확인해야합니다. 비어있는 경우 테이블에서 N 개의 행을 가져 와서 ExecutorService
다운로드를 위해 queue ( )에 추가 합니다. 네트워크 상태의 chnage을 확인하려면 생성 BroadcastReceiver
과 함께 LocalBroadcastManager
.이제 DownloadIntentService 에서 작성할 수있는 코드입니다 . 필요에 따라 수정하십시오.
private static int NUMBER_OF_CORES =
Runtime.getRuntime().availableProcessors() * 2;
private final ExecutorService executorService;
private final ExecutorCompletionService<DownloadModel> executorCompletionService;
public DownloadIntentService() {
super("DownloadIntentService");
executorService = Executors.newFixedThreadPool(NUMBER_OF_CORES);
executorCompletionService = new ExecutorCompletionService<>(executorService);
}
......
@Override
protected void onHandleIntent(Intent intent) {
//Check to see for storage permission
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
.....
//Now create job queue
....
//Fetch rows to download from table
DownloadQuery downloadQuery = new DownloadQuery(DownloadIntentService.this);
ArrayList<DownloadModel> downloadModelArrayList = downloadQuery.getDownload(DownloadContract.IFileDownloadStatus.NOT_DOWNLOADED,
0, NUMBER_OF_CORES);
//Check if queue contains any item
if (downloadModelArrayList.size() > 0) {
if (!executorService.isShutdown())
executorCompletionService.submit(new DownloadWorkerCallable(**Your download model from table to download**, DownloadIntentService.this));
}
.....
//Don't forget to shutdown the executorService
}
}
이것은 실제로 파일을 다운로드하는 DownloadWorkerCallable
구현 Runnable
입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다