Android 如何使用AsyncTask下载文件?

Android 如何使用AsyncTask下载文件?,android,download,android-asynctask,Android,Download,Android Asynctask,我正在使用此类下载文件: public class DownloadService extends Service { String downloadUrl; LocalBroadcastManager mLocalBroadcastManager; ProgressBar progressBar; File sdCard = Environment.getExternalStorageDirectory(); File dir = new File (s

我正在使用此类下载文件:

public class DownloadService extends Service {
    String downloadUrl;
    LocalBroadcastManager mLocalBroadcastManager;
    ProgressBar progressBar;
    File sdCard = Environment.getExternalStorageDirectory();
    File dir = new File (sdCard.getAbsolutePath() + "/org.test.download/");
    double fileSize = 0;
    DownloadAsyncTask dat;
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    public DownloadService(String url,Context c, ProgressBar pBar){
        downloadUrl = url;
        mLocalBroadcastManager = LocalBroadcastManager.getInstance(c);
        progressBar = pBar;
        dat = new DownloadAsyncTask();
        dat.execute(new String[]{downloadUrl});

    }

    private boolean checkDirs(){
        if(!dir.exists()){
            return dir.mkdirs();
        }
        return true;
    }
    public void cancel(){
        dat.cancel(true);
    }
    public class DownloadAsyncTask extends AsyncTask<String, Integer, String>{

        @Override
        protected String doInBackground(String... params) {
                String fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/")+1);
                if(!checkDirs()){
                    return "Making directories failed!";
                }
                try {
                    URL url = new URL(downloadUrl);
                    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.setRequestMethod("GET");
                    urlConnection.setDoOutput(true);
                    urlConnection.connect();
                    fileSize = urlConnection.getContentLength();
                    FileOutputStream fos = new FileOutputStream(new File(dir,fileName));
                    InputStream inputStream = urlConnection.getInputStream();
                    byte[] buffer = new byte[500];
                    int bufferLength = 0;
                    int percentage = 0;
                    double downloadedSize = 0;
                    while ( (bufferLength = inputStream.read(buffer)) > 0 ) 
                    {
                        if(isCancelled()){
                            break;
                        }
                        fos.write(buffer, 0, bufferLength);
                        downloadedSize += bufferLength;
                        percentage = (int) ((downloadedSize / fileSize) * 100);
                        publishProgress(percentage);
                    }
                    fos.close();
                    urlConnection.disconnect();
                } catch (Exception e) {
                    Log.e("Download Failed",e.getMessage());
                }
                if(isCancelled()){
                    return "Download cancelled!";
                }
            return "Download complete";
        }
        @Override
        protected void onProgressUpdate(Integer... values){
            super.onProgressUpdate(values[0]);
            if(progressBar != null){
                progressBar.setProgress(values[0]);
            }else{
                Log.w("status", "ProgressBar is null, please supply one!");
            }
        }

        @Override
        protected void onPreExecute(){
            mLocalBroadcastManager.sendBroadcast(new Intent("org.test.download.DOWNLOAD_STARTED"));
        }

        @Override
        protected void onPostExecute(String str){
            mLocalBroadcastManager.sendBroadcast(new Intent("org.test.download.DOWNLOAD_FINISHED"));
        }

        @Override
        protected void onCancelled(){
            mLocalBroadcastManager.sendBroadcast(new Intent("org.test.download.DOWNLOAD_CANCELLED"));
        }

    }

}
公共类下载服务扩展服务{
字符串下载URL;
本地广播经理mLocalBroadcastManager;
ProgressBar ProgressBar;
文件sdCard=Environment.getExternalStorageDirectory();
File dir=新文件(sdCard.getAbsolutePath()+“/org.test.download/”;
双文件大小=0;
下载异步任务数据;
@凌驾
公共IBinder onBind(意图arg0){
返回null;
}
公共下载服务(字符串url、上下文c、ProgressBar pBar){
下载url=url;
mLocalBroadcastManager=LocalBroadcastManager.getInstance(c);
progressBar=pBar;
dat=新的下载异步任务();
执行(新字符串[]{downloadUrl});
}
私有布尔checkDirs(){
如果(!dir.exists()){
return dir.mkdirs();
}
返回true;
}
公开作废取消(){
数据取消(真);
}
公共类DownloadAsyncTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串文件名=downloadUrl.substring(downloadUrl.lastIndexOf(“/”)+1);
如果(!checkDirs()){
返回“创建目录失败!”;
}
试一试{
URL=新URL(下载URL);
HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod(“GET”);
urlConnection.setDoOutput(true);
urlConnection.connect();
fileSize=urlConnection.getContentLength();
FileOutputStream fos=新的FileOutputStream(新文件(dir,fileName));
InputStream InputStream=urlConnection.getInputStream();
字节[]缓冲区=新字节[500];
int bufferLength=0;
整数百分比=0;
双下载大小=0;
而((bufferLength=inputStream.read(buffer))>0)
{
如果(isCancelled()){
打破
}
fos.写入(缓冲区,0,缓冲区长度);
downloadedSize+=缓冲区长度;
百分比=(int)((下载大小/文件大小)*100);
出版进度(百分比);
}
fos.close();
urlConnection.disconnect();
}捕获(例外e){
Log.e(“下载失败”,e.getMessage());
}
如果(isCancelled()){
返回“下载已取消!”;
}
返回“下载完成”;
}
@凌驾
受保护的void onProgressUpdate(整型…值){
super.onProgressUpdate(值[0]);
if(progressBar!=null){
progressBar.setProgress(值[0]);
}否则{
Log.w(“状态”,“ProgressBar为空,请提供一个!”);
}
}
@凌驾
受保护的void onPreExecute(){
发送广播(新的意图(“org.test.download.download_start”);
}
@凌驾
受保护的void onPostExecute(字符串str){
mLocalBroadcastManager.sendbroadcastmanager(新意图(“org.test.download.download_FINISHED”);
}
@凌驾
受保护的void onCancelled(){
mLocalBroadcastManager.sendbroadcastmanager(新意图(“org.test.download.download\u已取消”);
}
}
}
我之所以使用它,是因为显然
DownloadManager
API9
之前不起作用,我的目标是
API7

我有
ListView
,它解析XML文件并显示可以下载的包

如何修改该类以接受包含URL的字符串数组并逐个下载它们


或者有什么好方法可以下载文件列表吗?

使用IntentService。IntentService中的线程在后台运行,这意味着您不必处理所有混乱的线程处理

IntentService完成后会终止其线程,因此必须持久化数据


要与您的活动进行沟通,请使用广播接收器。

您能提供示例代码吗?您的答案可能会留在这里: