运行时异常“无法在未调用 looper.prepare() 的线程内创建处理程序”

Posted

技术标签:

【中文标题】运行时异常“无法在未调用 looper.prepare() 的线程内创建处理程序”【英文标题】:Runtime exception "can't create handler inside thread that has not called looper.prepare()" 【发布时间】:2015-07-26 01:27:47 【问题描述】:

我正在制作一个接收字符串的 UDP 服务器,我必须修改该字符串,但我似乎无法弄清楚如何将字符串转发到应该处理字符串的类,我得到以下例外:

"无法在未调用 looper.prepare() 的线程内创建处理程序"

我对android没有什么经验,不知道如何解决这个问题,其他关于这个问题的问题似乎都没有给我答案。

public class Server implements Runnable 

 @Override
 public void run() 
     while(!start)
     
         //do nothing
     
     try 
         InetAddress serverAddr = InetAddress.getByName(SERVERIP);
         //updateTrack("\nServer: Start connecting \n");
         DatagramSocket socket = new DatagramSocket(SERVERPORT, serverAddr);
         byte[] serverBuf = new byte[1064];
         DatagramPacket packet = new DatagramPacket(serverBuf, serverBuf.length);
         //updateTrack("Server: Receiving \n");
         socket.receive(packet);
         int realSize = packet.getLength();
         byte[] RealServerBuf = new byte[realSize];
         System.arraycopy (serverBuf, 0, RealServerBuf, 0, realSize);
         recived =  new String(RealServerBuf);
         //updateTrack("Server: " + recived + "\n");
         StringHandler stringHandler = new StringHandler();  
         stringHandler.StringSplitter(recived);
         updateTrack("Server: Succeed\n");
      catch (Exception e) 
         updateTrack("Server: Error\n" + e);
     
   

问题与我如何实例化 StringHandler.class 以及它没有与 UI 线程连接有关,但我不知道该怎么做。

【问题讨论】:

“问题与我如何实例化 StringHandler.class 有关”——Android 没有 StringHandler 类。如果我们不知道它是什么,我们将无法帮助您。除此之外,请发布与该崩溃相关的 Java 堆栈跟踪,指出堆栈跟踪中的哪些行与您问题中代码 sn-ps 中的行相对应。 欢迎堆栈溢出!为了获得最佳帮助,您需要告诉我们 StringHandler 是什么(例如 API 文档的链接),将完整的堆栈跟踪放在问题中,并清楚地确定异常被抛出的位置及其与位置的关系(如果?) 您调用堆栈跟踪中引用的looper.prepare()。这个问题也可能对您有所帮助***.com/questions/3875184/… 它甚至可能是重复的,但如果没有完整的信息,我们无法确定。我是通过搜索“looper.prepare() android”得到的 @MarkG 检查我发布的答案。可能会有所帮助。 【参考方案1】:

将您的代码放入 runOnUiThread

activity.runOnUiThread(new Runnable() 
  public void run() 
    // your code here
  
);

请查看this了解更多详情。

【讨论】:

【参考方案2】:

把你的代码放进去

activity.runOnUiThread(new Runnable() 
  public void run() 
   // your code here
 
);

【讨论】:

以上是关于运行时异常“无法在未调用 looper.prepare() 的线程内创建处理程序”的主要内容,如果未能解决你的问题,请参考以下文章

常见的运行时异常(uncheckedExcepiton)和非运行时异常(checkedExcepiton)

编译时异常与运行时异常的区别

Java运行时异常和非运行时异常

运行时异常和非运行时异常

Java之运行时异常与编译时异常区别

运行时异常和一般异常(受检异常)区别是什么?