2014-12-02 3 views
-2

У меня есть класс, который реализует runnable с функцией запуска.Ошибка Java/Android Thread pause

@Override 
public void run() 
{ 
    while(running) 
    { 
    // thread code goes here:: 
    threadCode();//// 
    // thread code ends here 
    try 
    { 
     Thread.sleep(10); 
    } 
    catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 
    } 
} 

Теперь я пытаюсь приостановить поток, если что-то случится. Я попытался использовать wait() и notify(), но он разбил приложение, после чего я пришел с идеей использовать «running» boolean и установил для него значение false, что и для паузы, а затем вернулся к true для возобновления. К сожалению, это все равно приводит к сбою приложения.

Это дает мне фатальную ошибку в logcat.

«Невозможно создать обработчик внутри потока, который не под названием Looper.prepare()»

Есть ли работать простой способ, чтобы приостановить поток? ;/ Thx

EDIT: это не про нить вообще. Я нашел, где он падает. Это сбой в диалоге предупреждения здесь код его:

AlertDialog.Builder builder1 = new AlertDialog.Builder(c); 
     builder1.setTitle("Game over!"); 
    builder1.setMessage("You survived "+secs+"."+msecs+ " seconds."); 
    builder1.setCancelable(false); 
    builder1.setPositiveButton("Replay", 
      new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) 
     { 
      // intialStuff(); 
      dialog.cancel(); 
     } 
    }); 
    builder1.setNegativeButton("Rage quit", 
      new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      dialog.cancel(); 
     } 
    }); 

    AlertDialog alert11 = builder1.create(); 
    alert11.show(); 

я пытаюсь запустить его на холст класса , может быть, не может работать на классе холста? C - контекст основной деятельности.

+0

Что делает ваш LogCat сказать вам? – 323go

ответ

0

В потоках Android работают по-разному в соответствии с обычной программой на основе Java. Нити, натянутые из потока пользовательского интерфейса, должны использовать Looper для собственного использования, иначе они возвращаются к Looper основного потока пользовательского интерфейса. Для вашего запроса, вызывающего Looper.prepare() из метода run, вероятно, будет использоваться кулачная строка внутри него. Однако из долгосрочной перспективы масштабируемости и правильного подхода рассмотрим использование Loader или AsynchTask.

+0

Не могли бы вы показать пример? – hey

+0

google для "android asynctask tutorial" – Nazgul

+0

проблема не в потоке, это связано с alertDialog, я отредактировал главный вопрос. ; o – hey

0

Было 2 проблемы: сначала я установил значение int в сообщении AlertDialog, которое вызвало сбой. Исправление:

setMessage("You survived "+Integer.toString(secs)+"."+Integer.toString(msecs)+" seconds.") 

Вторая проблема, и главное, я должен был использовать правша на нити так AlertDialog не врезаться.

Второе исправление: создать обработчик.

private Handler threadHandler = new Handler() 
{ 
     public void handleMessage(android.os.Message msg) 
     { 
      //Go to thread function 
      threadCode(); 
     } 
}; 

вызов его из функции запуска:

@Override 
public void run() 
{ 
    while(true) 
    { 
    try 
    { 
     Thread.sleep(10); 
     //handler 
     if(running) 
     threadHandler.sendEmptyMessage(0); 
    } 
    catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 
    } 
}