2015-11-04 4 views
1

Как я могу скрыть поток, изнутри цикла for.Невозможно приостановить/отключить поток внутри цикла

Это то, что я пытаюсь, но нет сна.

Thread newTread = new Thread() { 

    @Override 
    public void run() { 

     for (int x = 0; x < limit; x++) { 

      //some_code 

      try { 
       Thread.sleep(3000); 
      } 
      catch (Exception e){ 
       e.getLocalizedMessage(); 
      } 

      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        //someCode  
        } 
       }); 
      } 
     } 
    }; 
    newTread.start(); 

С кодом нет в коде?

+2

Две вещи. Во-первых, 'e.getLocalizedMessage()' не является распространенным способом обработки исключений, так как это не предоставляет всю информацию, которая может потребоваться для устранения вашей проблемы. Используйте e.printStackTrace(). Во-вторых, мы не можем знать, что не так с вашим кодом, поскольку ничего не похоже. Здесь немало вещей, о которых мы не знаем. Установлена ​​ли ваша предельная переменная не менее 1? Выполняется ли запуск? Попробуйте вставить 'Log.d (" thread "," somemessage 1 ");' в пару точек в вашем коде (с заменой 1 на 1,2,3, 4 и т. Д.) И отправить обратно вывод, который дает вам, когда вы это сделаете, мы сможем помочь. –

+1

@ DaniëlvandenBerg благодарит за то, что вы говорите об исключениях. и да, код работает безупречно, а предел установлен более чем на 1. и когда я ставлю Log после 'try ', я вижу Log внутри LogCat – behrooz

+0

И если вы положите его сразу после сна, вы видите, что они появляются с ожидаемым 3 второй интервал, или код пропускает сон? –

ответ

5

Я пошел вперед и бросил код в свой собственный проект, с некоторым добавленным кодом отладки. Вот код, который я использовал и который я получил.

Thread newTread = new Thread() { 

     @Override 
     public void run() { 

      for (int x = 0; x < 3; x++) { 

       Log.d("ThreadTest","1"); 

       try { 
        Log.d("ThreadTest","2"); 
        Thread.sleep(3000); 
        Log.d("ThreadTest", "3"); 
       } 
       catch (Exception e){ 
        e.printStackTrace(); 
       } 

       Log.d("ThreadTest","4"); 
       runOnUiThread(new Runnable() { 
            @Override 
            public void run() { 
             Log.d("ThreadTest","5"); 
            } 
           }); 
      } 
     } 
    }; 
    newTread.start(); 

11-04 08: 23: 38,920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 1 11-04 08: 23: 38,920 11419-11452/nl.buroboot .danielvandenberg.bootsnelleinvoer Д/ThreadTest: 2 11-04 08: 23: 41,920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 3 11-04 08: 23: 41,920 11419-11452/нл .buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest: 4 11-04 08: 23: 41.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest: 1 11-04 08: 23: 41.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest: 2 11-04 08: 23: 41.920 11419-11419/nl.buroboot.danielvandenberg .bootsnelleinvoer Д/ThreadTest: 5 11-04 08: 23: 44,920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 3 11-04 08: 23: 44,920 11419-11452/nl.buroboot .danielvandenberg.bootsnelleinvoer Д/ThreadTest: 4 11-04 08: 23: 44,920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 1 11-04 08: 23: 44,920 11419-11452/нл .buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest: 2 11-04 08: 23: 44.920 11419-11419/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 5 11-04 08: 23: 47,920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 3 11-04 8:23 : 47,920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 4 11-04 08: 23: 47,920 11419-11419/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 5

В моем случае код действительно ждал три секунды, поэтому ничего не получается с этим. Интересно отметить, однако, тот факт, что «5» может появиться после следующего 1. Это связано с тем, как работает runOnUiThread. Что он делает, это ставит runnable, который вы предоставляете в очереди. Из этой очереди андроид будет захватывать один запуск одновременно и запускать его, когда поток Ui успевает запустить его. Это означает, что, если вы должны были сделать что-то вроде этого:

newTread.start(); 
    boolean a = true; 
    while (a){ 
     try { 
      Thread.sleep(1); 
      a = a; 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

вы получите журнал, как:

11-04 08: 27: 51.810 14909-14942/nl.buroboot .danielvandenberg.bootsnelleinvoer Д/ThreadTest: 1 11-04 08: 27: 51,815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 2 11-04 08: 27: 54,815 14909-14942/нл .buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 3 11-04 08: 27: 54,815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 4 11-04 08: 27: 54,815 14909-14942/nl.buroboot. danielvandenberg.bootsnelleinvoer Д/ThreadTest: 1 11-04 08: 27: 54,815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 2 11-04 08: 27: 57,815 14909-14942/нл. buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 3 11-04 08: 27: 57,815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 4 11-04 08: 27: 57,815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadT Текущая: 1 11-04 08: 27: 57,815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 2 11-04 08: 28: 00,815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 3 11-04 08: 28: 00,815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer Д/ThreadTest: 4

Обратите внимание, что там не существует ни одного 5. Это связано с тем, что UI-поток слишком занят, чтобы выполнить стек. Я предполагаю, что это именно то, что происходит с тобой.

Моя рекомендация по фиксации: Breakpoints. Попытайтесь выяснить, если, и если да, то где ваш виджет UI висит и решает это. Этот код функционирует так, как должен.

-1

Из-за проголосовавшего: обратите внимание на комментарии в исходном коде ниже, они расскажут вам, как все работает.

private void waitForWifi() { 
     mProgressDialog = new Dialog.Builder(MainActivity.this).show(); 

     // creating a thread to wait until the connection is established 
     Thread t = new Thread() { 
      @Override 
      public void run() { 
       try { 
        while (!Utils.isConnected(MainActivity.this)) { 
        // we wait until condition is matching to fit our needs 
        Thread.sleep(300); 
        // Do NOT(!) use "sleep(1);" <- pure waste of battery  
        // and won't in 99,9% of the situa. make your app better! 
        } 
        mProgressDialog.dismiss(); 
        // perform a new action 
     }; 
     t.start(); 
    } 
+1

Не могли бы вы пояснить, почему этот код отвечает на вопрос? Кодовые ответы [обескуражены] (http://meta.stackexchange.com/q/148272/274165), потому что они не учат решению. (Кроме того, какие комментарии?) –

+0

См. Комментарии в коде. Какая польза, если я напишу «НЕ (!) Использовать Thread.sleep (1);» вне кода? Человек, задавший вопрос, должен дважды проверить, применяет ли его код правильное поведение к своему приложению. Поэтому в этот момент он должен уметь распознавать, насколько важным является комментарий, поскольку «мы ждем, пока условие будет соответствовать нашим потребностям». Это приостанавливает действие ... Не совсем ракетная наука. –

+0

Рамка «Может быть, вы это достигаете», что не имеет никакого смысла, возможно, это то, что меня отбрасывает. –

Смежные вопросы