同步下载文件(Android)

同步下载文件(Android),android,file,android-asynctask,synchronous,download-manager,Android,File,Android Asynctask,Synchronous,Download Manager,我有一个URL的数组,我会同步。 事实上,我在一个带有for循环的异步任务中。 我尝试使用downloadmanager和broadcast receiver,但没有成功(管理器使用了另一个线程,因此每次都无法注销,这是一个泄漏附加) 这是我的任务: package com.ylly.hypred.splashScreen.asynctask; import android.app.DownloadManager; import android.app.ProgressDialog;

我有一个URL的数组,我会同步。 事实上,我在一个带有for循环的异步任务中。 我尝试使用downloadmanager和broadcast receiver,但没有成功(管理器使用了另一个线程,因此每次都无法注销,这是一个泄漏附加)

这是我的任务:

    package com.ylly.hypred.splashScreen.asynctask;

import android.app.DownloadManager;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.util.Log;
import android.view.WindowManager;

import com.nostra13.universalimageloader.core.ImageLoader;
import com.ylly.hypred.R;
import com.ylly.hypred.api.CallAPI;
import com.ylly.hypred.api.model.MediaAPIModel;
import com.ylly.hypred.api.model.MediaArrayAPIModel;
import com.ylly.hypred.utils.FileManager;

import java.io.File;
import java.util.ArrayList;

/**
 * Created by YLLY on 17-11-2015.
 */
public class LoadMedias extends AsyncTask<String, Void, String> {
    private MediaArrayAPIModel mediaAPIModels;
    private Context context;
    private ProgressDialog progressDialog;
    private boolean isCallFromUpdate;
    private final String TAG = "LoadMedias";
    private OnLoadingIsFinished mCallback;

    /**
     *
     */
    public interface OnLoadingIsFinished {
        void callProcess();
    }

    /**
     *
     * @param context
     * @param urls
     * @param isCallFromUpdate
     */
    public LoadMedias(Context context, MediaArrayAPIModel urls, boolean isCallFromUpdate) {
        this.context = context;
        this.mediaAPIModels = urls;
        progressDialog = new ProgressDialog(context);
        this.isCallFromUpdate = isCallFromUpdate;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        if (!isCallFromUpdate)
            progressDialog.setTitle(context.getString(R.string.fm_etape_trois_sur_trois));

        progressDialog.setMessage(context.getString(R.string.fm_enregistrement));
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setIndeterminate(false);
        progressDialog.setCancelable(false);
        progressDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        progressDialog.setMax(mediaAPIModels.getMediaImagePIModels().size() + mediaAPIModels.getMediaFileAPIModels().size());
        progressDialog.setProgress(0);
        progressDialog.show();
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        if (progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
        mCallback.callProcess();
    }

    @Override
    protected String doInBackground(String... arg0) {
        try {
            loadMediaImages(mediaAPIModels.getMediaImagePIModels(), progressDialog);
            loadMediaFiles(context, mediaAPIModels.getMediaFileAPIModels(), progressDialog);
        } catch (Exception e) {
            Log.d(TAG, e.toString());
        }
        return "";
    }

    /**
     *
     * @param onLoadingIsFinished
     */
    public void setOnLoadingIsFinished(OnLoadingIsFinished onLoadingIsFinished) {
        this.mCallback = onLoadingIsFinished;
    }

    /**
     * @param mediaAPIModels
     * @param progressDialog
     */
    private void loadMediaImages(ArrayList<MediaAPIModel> mediaAPIModels, ProgressDialog progressDialog) {
        String type;
        for (int i = 0; i < mediaAPIModels.size(); i++) {
            type = mediaAPIModels.get(i).getUrl().substring(mediaAPIModels.get(i).getUrl().lastIndexOf("."));
            if (type.equals(".png") || type.equals(".jpg") || type.equals(".jpeg")) {
                ImageLoader.getInstance().loadImageSync(CallAPI.mBaseUrl + mediaAPIModels.get(i).getUrl());
                i++;
                progressDialog.setProgress(progressDialog.getProgress() + 1);
            }
        }
    }

    /**
     * @param context
     * @param mediaAPIModels
     * @param progressDialog
     */
    private void loadMediaFiles(Context context, ArrayList<MediaAPIModel> mediaAPIModels, final ProgressDialog progressDialog) {
        {
            String name;
            String mime;
            for (int i = 0; i < mediaAPIModels.size(); i++) {
                if (!FileManager.getInstance().getFileFromLocal(context, mediaAPIModels.get(i).getUrl(), false)) {
                    name = mediaAPIModels.get(i).getUrl().substring(mediaAPIModels.get(i).getUrl().lastIndexOf("/") + 1); //on sépare le nom du fichier du reste de l'url
                    mime = name.substring(name.lastIndexOf(".")); //on recupere l'extension du fichier

                    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(CallAPI.mBaseUrl + mediaAPIModels.get(i).getUrl()));
                    request.setDescription(context.getResources().getString(R.string.downloading) + " name");
                    request.setTitle(context.getResources().getString(R.string.app_name));
                    request.setMimeType(mime);
                    // in order for this if to run, you must use the android 3.2 to compile your app
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                        request.allowScanningByMediaScanner();
                        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                    }

                    request.setDestinationInExternalPublicDir("test" + File.separatorChar + "doc", name);

                    // get download service and enqueue file
                    DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);

                    context.registerReceiver(new BroadcastReceiver() {
                        @Override
                        public void onReceive(Context context, Intent intent) {
                            context.unregisterReceiver(this);
                            Log.d("DOWNLOAD", "unregister");
                            progressDialog.setProgress(progressDialog.getProgress() + 1);
                        }
                    }, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
                } else {
                    i++;
                    progressDialog.setProgress(progressDialog.getProgress() + 1);
                }
            }
        }
    }
}
package com.ylly.hypred.splashScreen.asynctask;
导入android.app.DownloadManager;
导入android.app.ProgressDialog;
导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.Intent;
导入android.content.IntentFilter;
导入android.net.Uri;
导入android.os.AsyncTask;
导入android.os.Build;
导入android.util.Log;
导入android.view.WindowManager;
导入com.nostra13.universalimageloader.core.ImageLoader;
导入com.ylly.hypred.R;
导入com.ylly.hypred.api.CallAPI;
导入com.ylly.hypred.api.model.MediaAPIModel;
导入com.ylly.hypred.api.model.mediaarayapimodel;
导入com.ylly.hypred.utils.FileManager;
导入java.io.File;
导入java.util.ArrayList;
/**
*由YLLY于2015年11月17日创建。
*/
公共类LoadMedias扩展异步任务{
私有MediaArrayAPIModel MediaPimodels;
私人语境;
私有进程对话;
私有布尔isCallFromUpdate;
私有最终字符串TAG=“LoadMedias”;
私有onload已完成mCallback;
/**
*
*/
公共接口联机加载完成{
void callProcess();
}
/**
*
*@param上下文
*@param URL
*@param isCallFromUpdate
*/
公共加载媒体(上下文上下文、MediaArrayAPI模型URL、布尔值isCallFromUpdate){
this.context=上下文;
this.mediaAPIModels=url;
progressDialog=新建progressDialog(上下文);
this.isCallFromUpdate=isCallFromUpdate;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
如果(!isCallFromUpdate)
progressDialog.setTitle(context.getString(R.string.fm_etape_trois_sur_trois));
progressDialog.setMessage(context.getString(R.string.fm_enregistrment));
progressDialog.setProgressStyle(progressDialog.STYLE_水平);
progressDialog.setUndeterminate(false);
progressDialog.setCancelable(假);
progressDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG\u DIM\u落后);
progressDialog.setMax(mediaAPIModels.getMediaImagePIModels().size()+mediaAPIModels.getMediaFileAPIModels().size());
progressDialog.setProgress(0);
progressDialog.show();
}
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
if(progressDialog.isShowing()){
progressDialog.disclose();
}
mCallback.callProcess();
}
@凌驾
受保护的字符串doInBackground(字符串…arg0){
试一试{
加载MediaImages(mediaAPIModels.getMediaImagePIModels(),progressDialog);
加载媒体文件(上下文,mediaAPIModels.getMediaFileAPIModels(),progressDialog);
}捕获(例外e){
Log.d(标记,例如toString());
}
返回“”;
}
/**
*
*@param onload已完成
*/
公共无效设置OnLoadingIsFinished(OnLoadingIsFinished OnLoadingIsFinished){
this.mCallback=onload已完成;
}
/**
*@param-mediaAPIModels
*@param progressDialog
*/
私有void loadMediaImages(ArrayList MediaAPI模型,ProgressDialog ProgressDialog){
字符串类型;
对于(int i=0;i=Build.VERSION\u code.HONEYCOMB){
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.request.VISIBILITY\u VISIBLE\u NOTIFY\u完成);
}
request.setDestinationNexternalPublicDir(“test”+File.separatorChar+“doc”,name);
//获取下载服务并将文件排队
DownloadManager=(DownloadManager)context.getSystemService(context.DOWNLOAD\u服务);
registerReceiver(新的BroadcastReceiver(){
@凌驾
公共void onReceive(上下文、意图