-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

XML ファイルをListView解析し、ダウンロードできるパッケージを表示します。

このクラスを変更して、URL を含む文字列の配列を受け入れ、それらを 1 つずつダウンロードするにはどうすればよいですか?

または、ファイルのリストをダウンロードする良い方法はありますか?

4

1 に答える 1

2

IntentService の使用を検討してください。IntentService のスレッドはバックグラウンドで実行されます。つまり、混乱したスレッド処理をすべて処理する必要はありません。

IntentService は、完了するとスレッドを強制終了するため、データを永続化する必要があります。

アクティビティに返信するには、ブロードキャスト レシーバーを使用します。

于 2012-11-19T23:16:07.210 に答える