我们应该使用什么来从远程服务器下载大文件。服务? IntentService?的AsyncTask?线?还是android中的其他东西?

时间:2016-02-14 08:04:06

标签: android multithreading performance android-asynctask background-process

我是android的新手,我经历了很多论坛和讨论,但我仍然对从服务器上下载大文件应该用什么感到困惑!

在我们的应用程序中,我们在应用程序前端的播放列表中播放多个视频,同时我们调用API服务来获取播放列表中的列表视频,我们在asynctask中调用API并且onpostexecute方法解析API响应并排队任何要在downloadmanger中下载的新文件。

关注点

  1. 是否正在使用asynctask从远程API获取响应?或者我们有更好的选择吗?
  2. 从main中调用下载管理器是一种不好的做法,因为我从阅读中理解,那么最好的方法是什么(Service,IntentService,Thread或AsyncTask)?在这种情况下使用Service,IntentService,Thread或AsyncTask会有什么不同。
  3. 如果有来电或用户点击主页按钮,我们可以在应用程序启动时执行下载,因此下载仍应继续,不要浪费用于已下载部分的带宽,内存等。
  4. 即使应用程序处于后台,我们也可以启动下载吗?
  5. 我们是否应该在不同的线程中进行数据库操作,这是最佳做法吗?
  6. 公共类MediaAsyncTask扩展了AsyncTask> {

        @Override
        protected List<Media> doInBackground(String... params) {
            List<Media> result = new ArrayList<Media>();
            try {
                ResponseHandler responseHandlerObj = new ResponseHandler(getApplicationContext());
                result = responseHandlerObj.deviceMedia(device_id);
                media_status = responseHandlerObj.getResponse_status();
                media_msg = responseHandlerObj.getResponse_msg();
                media_version = responseHandlerObj.getMedia_version();
                medias_total = responseHandlerObj.getMedias_total();
            } catch (Exception e) {
                Log.d(TAG, e.getLocalizedMessage());
                e.printStackTrace();
            }
            return result;
        }
    
    
        @Override
        protected void onPostExecute(List<Media> result) {
            Log.e(TAG, "status " + media_status);
            if (media_status.equals(STATUS_SUCCESS)) {
                Log.d(TAG, media_msg);
                if (device_path != null) {
                    int _total_downloaded = databaseHandler.getDownloadedMediaCount(device_id);
                    int _total_in_api = medias_total;
                    int _downloaded_version = preferenceHelper.getDeviceMediaVersion(device_id);
                    Log.d(TAG, "media_version : " + media_version + " _downloaded_version : " + _downloaded_version + " _total_downloaded : " + _total_downloaded + " _total_in_api : " + _total_in_api);
                    //remove true after testing
                    if (media_version != _downloaded_version || _total_downloaded != _total_in_api) {
                        databaseHandler.deleteAllDeviceMedias(device_id);
                        int id;
                        String file;
                        for (Media media : result) {
                            id = 0;
    
                            file = media.getFile();
                            String file_url = media.getFile_url();
                            Log.d(TAG, "media file exists: " + fileManager.checkFileExists(device_path, file));
                            if (file != null && !fileManager.checkFileExists(device_path, file) && URLUtil.isValidUrl(file_url)) {
                                media.setDownloaded(0);
                                id = databaseHandler.saveMedia(media);
                                queueDownload(file_url, file);
                            } else if (fileManager.checkFileExists(device_path, file)) {
                                long app_size = (int) fileManager.getFileSize(device_path + "/" + file);
                                long server_size = media.getFile_size();
                                long server_size_minus = server_size - 100;
                                if (app_size < server_size_minus) {
                                    fileManager.deleteFile(device_path + "/" + file);
                                    queueDownload(file_url, file);
                                } else {
                                    id = saveDownloadedResource(media);
                                }
                            }
    
    
                        }
    
                    }
                    if (download_files.size() == 0) {
                        Log.d(TAG, "nothing to download");
                        preferenceHelper.setDeviceMediaVersion(device_id, media_version);
                    }
                }
    
            } else {
                Log.e(TAG, "Media: Failed to fetch data!");
            }
        }
    
        private int saveDownloadedResource(Media media) {
            int id = 0;
    
            media.setDownloaded(1);
            id = databaseHandler.saveMedia(media);
            initUpdateLayoutOnNewResource();
            return id;
        }
    }
    

0 个答案:

没有答案