Android Threads ждет - PullRequest
       13

Android Threads ждет

0 голосов
/ 15 июля 2011

в своем приложении для Android я использую начальную активность для создания всплеска загрузки с помощью ASyncTask, а затем запускаю основное действие, которое загружает около 10 изображений и показывает его пользователю в таблице.Я только сегодня начал исследовать DDMS и режим отладки, и я вижу, что после загрузки приложения у меня есть один поток для asynctask и 10 потоков HTTP, ожидающих.Это нормально?Разве они не должны умереть с последней выполненной инструкцией?

Вот мой код:

public void download (String imageURL, String path, String filename){
     new Thread(){
       public void run() {
                    long startTime = System.currentTimeMillis();
                try {
                    //Create the path
                    new File(path).mkdirs();
                    //File to download
                    File file = new File(path+filename);
                    if (!file.exists()){
                        Log.d(Manager.getAppName(),file.getName()+" dont exists");
                        URL url = new URL(imageURL);
                        URLConnection ucon = url.openConnection();
                        InputStream is = ucon.getInputStream();
                        BufferedInputStream bis = new BufferedInputStream(is);
                        ByteArrayBuffer baf = new ByteArrayBuffer(50);
                        int current = 0;
                        while ((current = bis.read()) != -1) {
                                baf.append((byte) current);
                        }
                        FileOutputStream fos = new FileOutputStream(file);
                        fos.write(baf.toByteArray());
                        bis.close();
                        fos.close();
                                    is.close();
                        Log.d(Manager.getAppName(), "download ready in "
                                        +( (float)(System.currentTimeMillis() - startTime) / 1000f)
                                        + " sec");
                    } else {
                        Log.d(Manager.getAppName(),"File exists (ignoring)");

                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (latch!=null){
                    latch.countDown();
                    Log.d(Manager.getAppName(),"Download finished "+latch.getCount()+" remaining");
                }
            }
        }).start();

}

Ответы [ 2 ]

0 голосов
/ 04 января 2017

Это правильное поведение, так как AsyncTask и библиотеки, такие как okhttp, используют пул потоков.В зависимости от системы в пуле может быть максимальное количество потоков.Всякий раз, когда требуется новый поток (например, когда создается новый AsyncTask), будет использоваться один из бездействующих потоков из пула, тем самым предотвращая издержки, связанные с созданием нового потока каждый раз.После завершения задачи поток возвращается в состояние ожидания в пуле со статусом «ожидание».

0 голосов
/ 15 июля 2011

Потоки не умрут, если они являются частью пула потоков. Ты сам их начинаешь?

...