1

imageurl の配列があり、DownloadFromUrl 関数でダウンロードし、myfunction から呼び出します。スレッドを使用します。画像の URL がいくつあるかわかりません。作成されたすべての画像ダウンロードの個別のスレッドについて、これらすべてのスレッドの後にアクティビティを開始したいと思います。終わり。

これらのスレッドをすべて取得するにはどうすればよいですか。スレッドのスリープが長くなるとうまくいかないため、適切な手順ではありません。また、画像のダウンロードに失敗したり、URLが壊れたり、接続がタイムアウトしないことがあるため、静的変数カウントでスレッドの最後までカウントできません。

私は今、少し迷っています。これらすべてのスレッドが終了したことを確認するには、どうすればよいですか?

public void DownloadFromUrl(String DownloadUrl, String fileName) {

               try {
                       File root = android.os.Environment.getExternalStorageDirectory();               

                       File dir = new File (root.getAbsolutePath() + "/"+Imageurl.facebookpage);
                   if(dir.exists()==false) {
                        dir.mkdirs();
                   }

                   URL url = new URL(DownloadUrl); //you can write here any link
                   File file = new File(dir, fileName);



                   /* Open a connection to that URL. */
                   URLConnection ucon = url.openConnection();

                   /*
                    * Define InputStreams to read from the URLConnection.
                    */
                   InputStream is = ucon.getInputStream();
                   BufferedInputStream bis = new BufferedInputStream(is);

                   /*
                    * Read bytes to the Buffer until there is nothing more to read(-1).
                    */
                   ByteArrayBuffer baf = new ByteArrayBuffer(5000);
                   int current = 0;
                   while ((current = bis.read()) != -1) {
                      baf.append((byte) current);
                   }


                   /* Convert the Bytes read to a String. */
                   FileOutputStream fos = new FileOutputStream(file);
                   fos.write(baf.toByteArray());
                   fos.flush();
                   fos.close();
                   LoginActivity.statsofdownload++;

                   Log.d("DownloadManager","file://"+file.getAbsolutePath());

           } catch (IOException e) {
               Imageurl.pagestat="space";
               Log.d("DownloadManager", "Error: " + e);
           }

        }




myfunction()
{
 for(String string : Imageurl.output) {
                            imagea++;
                        final   int ind =imagea;
                        final String ss=string;
                        new Thread(new Runnable() {
                                public void run() {
                                      DownloadFromUrl(ss,"IMAGE"+ind+".jpeg");
                                      File root = android.os.Environment.getExternalStorageDirectory();         




                                   Imageurl.newyearsvalues.add("file://"+root.getAbsolutePath() + "/"+Imageurl.facebookpage+ "/"+"IMAGE"+ind+".jpeg");

                              }
                                }).start();


                    }

//// now need to call an activity but how I will know that these thread all end
}
4

3 に答える 3

2

代替案 1 :およびExecutorServiceとともに使用:shutdown()awaitTermination()

ExecutorService taskExecutor = Executors.newFixedThreadPool(noOfParallelThreads);
while(...) {
  taskExecutor.execute(new downloadImage());
}
taskExecutor.shutdown();
try {
  taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
  ...
}

基本的に、それ以上のスレッド要求の受け入れを shutdown()停止するということです。すべてのスレッドの実行が完了するまで待機します。ExecutorServiceawaitTermination()ExecutorService

代替案 2:使用CountDownLatch:

CountDownLatch latch = new CountDownLatch(totalNumberOfImageDownloadTasks);
ExecutorService taskExecutor = Executors.newFixedThreadPool(noOfParallelThreads);
while(...) {
  taskExecutor.execute(new downloadImage());
}

try {
  latch.await();
} catch (InterruptedException E) {
   // handle
}

imageDowloader() 関数内に次の行を追加します。

latch.countDown();

これにより、実行ごとにラッチの値が 1 ずつ増加します。

于 2013-04-10T20:18:01.560 に答える