代码之家  ›  专栏  ›  技术社区  ›  Vipul Rana

Java语言lang.RuntimeException:无法在尚未调用Looper的线程内创建处理程序。prepare()错误

  •  -1
  • Vipul Rana  · 技术社区  · 7 年前

    SongList Code in the image 无法理解错误的实际内容以及原因。错误如下所示。

    W/System.err: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    W/System.err:     at android.os.Handler.<init>(Handler.java:200)
    W/System.err:     at android.os.Handler.<init>(Handler.java:114)
    W/System.err:     at android.app.Activity.<init>(Activity.java:754)
    W/System.err:     at android.app.ListActivity.<init>(ListActivity.java:175)
    W/System.err:     at com.example.vipul.finalproject.PlayListActivity.<init>(PlayListActivity.java:0)
    W/System.err:     at com.example.vipul.finalproject.SongList.scanSongs(SongList.java:296)
    W/System.err:     at com.example.vipul.finalproject.activities.ActivityMenuMain$ScanSongs.doInBackground(ActivityMenuMain.java:299)
    W/System.err:     at com.example.vipul.finalproject.activities.ActivityMenuMain$ScanSongs.doInBackground(ActivityMenuMain.java:289)
    W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
    W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
    W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    W/System.err:     at java.lang.Thread.run(Thread.java:818)
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Xavier Rubio Jansana    7 年前

    看见 this article 了解整体 Looper / Handler 关系

    长话短说,你的 Thread#run() 方法必须遵循如下结构:

    new Thread(new Runnable() {
        @Override
        public void run() {
            Looper.prepare();
            mHandler = new Handler();
            Looper.loop();
        }
    }).start();
    
        2
  •  -1
  •   Pomagranite    7 年前

    The best explanation on why 在一个线程上需要一个循环器来保存指令,在另一个线程上执行指令。在多线程应用程序中,任务可能在执行其他任务时出现。