2016-05-07 2 views
0

Я пытаюсь получить растровое изображение из нескольких URL-адресов изображений и добавить его в arraylist, для этого я использую код ниже.Android Thread Synchronization

for (int j = 0; j <= imagePaths.size() - 1; j++) { 
        final String urltemp = "http://SiteName/" + imagePaths.get(j); 
        new Thread(new Runnable() { 
         @Override 
         public void run() { 
          try { 
           final URL url = new URL(urltemp); 
           HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
           connection.setDoInput(true); 
           connection.connect(); 
           InputStream input = null; 
           input = connection.getInputStream(); 
           Bitmap myBitmap = BitmapFactory.decodeStream(input); 
           arrayList.add(myBitmap); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
         } 
        }).start(); 
       } 

код работает нормально, но порядок изображения в ArryList изменяется случайным образом. Как синхронизировать потоки внутри цикла, чтобы изображения добавлялись в порядке цикла.

+0

Я решил, добавив Thread.join(), я знаю, что он будет делать другие потоки ждать. – Manish

ответ

0

1- Вы должны использовать пул потоков для такого вида заданий 2- Не синхронизируйте свои потоки, просто поместите растровое изображение в класс контейнера и сохраните его индекс, а затем отсортируйте массив.

1

Позвольте мне сказать, что код, который у вас есть, очень плох, поскольку нет ограничений на количество потоков. Это происходит потому, что каждая загрузка происходит в отдельном потоке и как долго выполняется поток, зависит от размера загружаемого изображения.

Но если вы все еще хотите, чтобы идти по этому пути, используйте этот код:

ArrayList<Bitmap> arrayList = new Arraylist<~>[imagePaths.size()] 
for (int j = 0; j <= imagePaths.size() - 1; j++) { 
       final String urltemp = "http://SiteName/" + imagePaths.get(j); 
       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         try { 
          final URL url = new URL(urltemp); 
          HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
          connection.setDoInput(true); 
          connection.connect(); 
          InputStream input = null; 
          input = connection.getInputStream(); 
          Bitmap myBitmap = BitmapFactory.decodeStream(input); 

          //here is the change 
          arrayList.add(j, myBitmap); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
       }).start(); 
      }