2014-01-21 2 views
-1

Я пытаюсь реализовать Runnable и запускать метод Run() при запуске потока. но когда я запускаю программу, она разбилась.реализовать Runnable Run() при запуске потока

MainActivity

public class MainActivity extends Activity implements Runnable{ 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      Thread t1; 
      t1=new Thread(this); 
      t1.start(); 
     } 

     public void run() { 
      // TODO Auto-generated method stub 
      Toast.makeText(MainActivity.this, "display something", 
        Toast.LENGTH_LONG).show(); 
     } 

я попытался изменить его t1=new Thread(new MainActivity()); (приложение разбился) или просто t1 = новый Thread(); никогда не сбой, но выход.

Как реализовать Runnable Run при запуске потока? я искал по всему месту, но не мог найти ответ. Мне нужно включить эту функцию в мой основной код проекта. но я создаю отдельный тестовый проект, чтобы узнать, как это работает, поэтому я могу добавить его в свой основной код проекта сам. в моем главном проекте он тоже разбился. он никогда не доходил до метода Run.

после того, как он упал, это LogCat

01-21 13:03:06.460: W/dalvikvm(879): threadid=11: thread exiting with uncaught exception (group=0xb3a6fb90) 
01-21 13:03:06.460: E/AndroidRuntime(879): FATAL EXCEPTION: Thread-51 
01-21 13:03:06.460: E/AndroidRuntime(879): Process: com.example.testthreadrun, PID: 879 
01-21 13:03:06.460: E/AndroidRuntime(879): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
01-21 13:03:06.460: E/AndroidRuntime(879): at android.os.Handler.<init>(Handler.java:200) 
01-21 13:03:06.460: E/AndroidRuntime(879): at android.os.Handler.<init>(Handler.java:114) 
01-21 13:03:06.460: E/AndroidRuntime(879): at android.widget.Toast$TN.<init>(Toast.java:327) 
01-21 13:03:06.460: E/AndroidRuntime(879): at android.widget.Toast.<init>(Toast.java:92) 
01-21 13:03:06.460: E/AndroidRuntime(879): at android.widget.Toast.makeText(Toast.java:241) 
01-21 13:03:06.460: E/AndroidRuntime(879): at com.example.testthreadrun.MainActivity.run(MainActivity.java:29) 
01-21 13:03:06.460: E/AndroidRuntime(879): at java.lang.Thread.run(Thread.java:841) 
01-21 13:03:07.010: I/Choreographer(879): Skipped 126 frames! The application may be doing too much work on its main thread. 
01-21 13:03:07.970: I/Choreographer(879): Skipped 165 frames! The application may be doing too much work on its main thread. 
01-21 13:03:08.840: D/gralloc_goldfish(879): Emulator without GPU emulation detected. 
01-21 13:03:10.770: I/Choreographer(879): Skipped 31 frames! The application may be doing too much work on its main thread. 
01-21 13:03:26.670: I/Process(879): Sending signal. PID: 879 SIG: 9 
+0

Я создавал этот метод, чтобы проверить, может ли этот метод реализовать метод run. это для моего проекта, который имеет более одной ошибки. Я не хочу публиковать столько вопросов в первую очередь. во всяком случае, я понял, как заставить поток работать. Благодарю. – Myst

ответ

3

Поскольку вы пытаетесь обновить UI, что вам нужно сделать это на UI Thread. Вы должны использовать что-то вроде runOnUiThread() или AsyncTask.

runOnUiThread(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
      Toast.makeText(MainActivity.this, "display something", 
       Toast.LENGTH_LONG).show(); 
    } 
}); 

или

Example of AsyncTask

AsyncTask Docs

0

Вы не можете сделать изменения пользовательского интерфейса (как тост) в потоке, который не является поток пользовательского интерфейса. Используйте это вместо:

public void run() { 
     MainActivity.this.runOnUiThread(new Runnable(){ 

       @Override 
       public void run(){ 
        Toast.makeText(MainActivity.this, "display something", 
       Toast.LENGTH_LONG).show(); 
       } 
     }); 

} 

Однако, почему вы создаете целую отдельную нить, чтобы показать тост? Вам лучше просто положить Toast.makeText(MainActivity.this, "display something", Toast.LENGTH_LONG).show(); в ваш метод onCreate.

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