спать / ждать в приложениях для Android - PullRequest
0 голосов
/ 20 апреля 2010

У меня было действие, которое вызывает поток 10 раз один за другим. Однако, если сеть работает медленно или загружено слишком много информации, произойдет принудительное закрытие. Поможет ли добавление сна в каждую ветку решить эту проблему? или есть другие способы ее решения?

   public void run() {
         if(thread_op.equalsIgnoreCase("xml")){
              readXML();
         }
         else if(thread_op.equalsIgnoreCase("getImg")){
              getWallpaperThumb();
         }
         handler.sendEmptyMessage(0);
    }

    private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                    int count = 0;
                    if (!myExampleHandler.filenames.isEmpty()){
                          count = myExampleHandler.filenames.size();
                    }
                    count = 5;
                    if(thread_op.equalsIgnoreCase("xml")){
                            pd.dismiss();
                            thread_op = "getImg";
                            btn_more.setBackgroundResource(R.drawable.btn_more);

                    }
                    else if(thread_op.equalsIgnoreCase("getImg")){
                            setWallpaperThumb();
                            index++;
                            if (index < count){
                                    Thread thread = new Thread(GalleryWallpapers.this);
                                    thread.start();

                            }
                    }
            }
    };

Ответы [ 2 ]

1 голос
/ 20 апреля 2010

Первым шагом должна быть проверка трассировки стека, которая выдаст ошибочную строку и причину. Вы можете использовать Logcat для этого.

0 голосов
/ 20 апреля 2010

Вы получаете диалоговое окно «Приложение не отвечает» (ANR) или приложение закрывается?

ANR появляется, когда поток петлителя пользовательского интерфейса занимает слишком много времени для возврата из вызова. Наличие 10 или 100 потоков не должно вызывать каких-либо проблем, если функция handleMessage возвращается своевременно.

Если вы действительно хотите ограничить количество потоков, которые должны выполняться за один раз, посмотрите ExecutorService

ExecutorService executorService = Executors.newFixedThreadPool(5);
    executorService.submit(new Runnable() {
        public void run() {
            // This is your thread
        }
    });

Вы можете отправить все 10 заданий в службу executor, и они будут выполняться одно за другим, максимум 5 одновременно.

...