当前位置: 首页 > 知识库问答 >
问题:

android中的主线程或UI线程在哪里准备looper?

田琛
2023-03-14

似乎在主线程中,我只需要编写一个扩展Handler并覆盖其handleMessage方法的类。然后我可以只创建Handler对象而无需准备looper。

class myHandler extends Handler{

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        String s=(String)msg.obj;
        textView.setText(s);
    }
}

在主线程中,以下代码起作用:

handler=new myHandler();

但是在worker线程中你确实需要先准备looper然后才能创建Handler对象,否则threadLocal.get()就不能为当前worker线程获取looper。我的问题是一定有地方为主线准备弯针,但我就是找不到。我不知道threadLocal如何为主线程找到这个looper。

class WorkerThread extends Thread{
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        Looper.prepare();
        handler=new Handler(){

            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                super.handleMessage(msg);
                System.out.println(msg.obj.toString());
                System.out.println(Thread.currentThread().getName());
            }

        };

        Looper.loop();
    }

}

共有2个答案

梁丘远航
2023-03-14

您必须在主线程中定义Looper。

handler = new Handler(Looper.getMainLooper());

您可以从主线程或其他工作线程调用此方法。要谨慎。

void timerMethod(){
    handler.postDelayed(new Runnable() {
        public void run() {
            setTime();
        }
    }, timeDelay);
}
韦昊焜
2023-03-14

Main looper是在ActivityThread类的main方法中准备的,具有以下方法调用:

Looper.prepareMainLooper();

例如,请参阅此处的源代码。

 类似资料:
  • 我在准备好的语句中使用了命令,当我在单线程环境中执行它时,它的工作很好,但是在多线程环境中,它会引起一些问题,那就是数据重复,即如果我有5个线程,每个记录会重复5次,我认为db中没有锁来帮助线程。我的代码: 如果employee.size=5,thread count=5,执行后我将得到25条记录,而不是5条

  • 问题内容: 我对android完全陌生,只想知道它是否是在主线程外更新UI的任何可行且可行的方法。仅从我的代码中,我就在下面列出了这些代码;根本不可能。但是, 我只想使用另一个线程来更新UI 。请事先帮助我! 问题答案: 使用activity.runOnUiThread

  • 问题内容: 我刚刚开始进行android开发,并且更新UI确实使我很烦:/ 到目前为止,这是我一直在努力的工作- 它工作正常,但是每个人都说要在主线程中做图形,所以我正在尝试(但失败)将其传递给另一个线程。麻烦的是,我真的不知道怎么做,因为我从未真正使用过线程。 Google给出的有关使用Threads的示例似乎并不十分清楚,我也无法真正按照自己的意愿去做。我可以请某人在这里给我一个最基本的例子,

  • 问题内容: 如何在Android中从辅助线程调用主线程? 问题答案: 最简单的方法是从线程中调用runOnUiThread(…)

  • 问题内容: 我通过以下方式创建了线程服务: 关闭应用程序后,电话的工作速度非常慢,我猜这是由于线程终止失败引起的。 有谁知道在终止应用程序之前终止所有线程的最佳方法是什么? 问题答案: 附录 :Android框架为一次性工作,后台工作等提供了许多帮助程序,与在许多情况下尝试滚动自己的线程相比,它们可能更可取。如下面的文章所述,AsyncTask是一个很好的起点。我鼓励读者在开始考虑自己编写线程之前

  • Java 8的promise实现,即CompletableFuture,提供了应用(…)和get()方法。 其中,在必要时等待promise完成,然后返回其结果。 现在假设我们使用(或)链接一些代码以在UI线程上运行(请参见stackoverflow.com/thenApply和thenApplyAsync之间的差异)。 如果我们在UI线程中调用,比如Java以某种方式处理这种情况,或者它会导致所