【问题标题】:implement Runnable Run() when thread is started线程启动时实现 Runnable Run()
【发布时间】:2014-01-21 18:06:50
【问题描述】:

我正在尝试实现 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());(app crashed) 或只是 t1=new 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

【问题讨论】:

  • 我正在创建这个方法来检查这个方法是否可以实现 run 方法。这是针对我的项目的,该项目有不止一个错误。我不想先发布这么多问题。无论如何,我想出了如何使线程工作。谢谢。

标签: java android


【解决方案1】:

由于您尝试更新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

【讨论】:

    【解决方案2】:

    您不能从后台线程更新 ui。您只能从 ui 线程更新 ui。

    您可以使用runOnUiThread。但是只是显示祝酒词,为什么需要线程呢?

    http://developer.android.com/guide/components/processes-and-threads.html

    【讨论】:

      【解决方案3】:

      您不能在不是 UI 线程的线程上进行 UI 更改(例如祝酒词)。改用这个:

      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 方法中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-13
        • 2012-02-28
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        • 2015-02-25
        • 1970-01-01
        • 2011-08-27
        相关资源
        最近更新 更多