Я пошел вперед и бросил код в свой собственный проект, с некоторым добавленным кодом отладки. Вот код, который я использовал и который я получил.
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 висит и решает это. Этот код функционирует так, как должен.
Две вещи. Во-первых, 'e.getLocalizedMessage()' не является распространенным способом обработки исключений, так как это не предоставляет всю информацию, которая может потребоваться для устранения вашей проблемы. Используйте e.printStackTrace(). Во-вторых, мы не можем знать, что не так с вашим кодом, поскольку ничего не похоже. Здесь немало вещей, о которых мы не знаем. Установлена ли ваша предельная переменная не менее 1? Выполняется ли запуск? Попробуйте вставить 'Log.d (" thread "," somemessage 1 ");' в пару точек в вашем коде (с заменой 1 на 1,2,3, 4 и т. Д.) И отправить обратно вывод, который дает вам, когда вы это сделаете, мы сможем помочь. –
@ DaniëlvandenBerg благодарит за то, что вы говорите об исключениях. и да, код работает безупречно, а предел установлен более чем на 1. и когда я ставлю Log после 'try ', я вижу Log внутри LogCat – behrooz
И если вы положите его сразу после сна, вы видите, что они появляются с ожидаемым 3 второй интервал, или код пропускает сон? –