使用 Android Looper 仍然抛出“Can't create handler inside...”

Posted

技术标签:

【中文标题】使用 Android Looper 仍然抛出“Can\'t create handler inside...”【英文标题】:Using Android Looper still throwing "Can't create handler inside..."使用 Android Looper 仍然抛出“Can't create handler inside...” 【发布时间】:2014-08-29 21:04:57 【问题描述】:

我有一个活套和处理程序:

private Handler handler;

public class LooperThread extends Thread

    @Override
    public void run()
    
        Looper.prepare();
        handler = new Handler()
        
            @Override
            public void handleMessage(Message message)
            
                updateUI(message.obj);
            
        ;

        Looper.loop();
    

然后在我的 MainActivity 中调用:

new LooperThread().start();
new Thread(new WorkerTask()).start();

WorkerTask 实现 Runnable 的地方。

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

在我的 workerTask 中,它在第二行抛出错误:

locationManager = (LocationManager) activity.getSystemService(activity.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);

【问题讨论】:

我认为这篇文章回答了我的问题:***.com/questions/17476847/… 可以发一下worker任务的代码吗?你的LooperThread没问题 【参考方案1】:

如果这是在 Activity 或 Fragment 中,您可以简单地使用 runOnUiThread 来更新 ui。

【讨论】:

【参考方案2】:

你需要使用这个:

activity.runOnUiThread(new Runnable() 
  public void run() 
    updateUI(message.obj);
  
);

或者将它与您现有的代码一起使用:

private Handler handler;

public class LooperThread extends Thread

    @Override
    public void run()
    
        Looper.prepare();
        handler = new Handler()
        
            @Override
            public void handleMessage(Message message)
            
                activity.runOnUiThread(new Runnable() 
                public void run() 
                    updateUI(message.obj);
                
                );
            
        ;

        Looper.loop();
    

【讨论】:

以上是关于使用 Android Looper 仍然抛出“Can't create handler inside...”的主要内容,如果未能解决你的问题,请参考以下文章

安卓Looper源码总结

Handler的工作原理。为啥在子线程中使用Handler会抛出异常

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

Handler的使用

ClipboardManager 抛出以下错误:Can't create handler inside thread that has not called Looper.prepare() usin

Android怎样保证一个线程最多仅仅能有一个Looper?