-3

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

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"));
        }

    }

}

我正在使用它,因为在此DownloadManager之前显然不会工作API 9并且我的目标是API 7

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

如何修改此类以接受包含 URL 的字符串数组并一一下载?

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

4

1 回答 1

2

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

IntentService 完成后会终止其线程,因此您必须保留数据。

要与您的 Activity 进行通信,请使用广播接收器。

于 2012-11-19T23:16:07.210 回答