问题标签 [looper]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1502 浏览

java - 如何正确使用带有套接字的 HandlerThread?

我一直在查看 HandlerThread 类,因为我最初使用的是一个简单的线程和处理程序,但是在android中出现了一个带有 NetworkOnMainThreadException 的裁剪器。

我似乎无法理解如何将诸如套接字之类的东西引入到 HandlerThread 中,您可以在其中运行阻塞代码。但是你不能用 HandlerThread 做到这一点,因为你不应该覆盖 run 因为那是 looper 所在的地方。

而且我不能通过消息调用 HandlerThread 来开始侦听套接字,因为它会阻止传递给它的任何其他消息。

那么这个 HandlerThread 类是为非阻塞任务设计的吗?因为我似乎无法理解如何使用这样的线程,所以它可以在套接字上侦听但可以处理请求,就像我从主 UI 线程创建普通线程时一样

我可以在普通线程中调用 Looper.prepare() 和 Looper.loop() 在运行中,然后将代码放在这两行之间(通过检查来创建处理程序)但是我遇到了与通信的问题这个新线程,消息不会传递到线程中。

那么我该如何去创建可以使用处理程序相互通信并执行诸如使用套接字之类的任务的线程。

请我不是在寻找使用 ASyncTask 的评论,我想知道我自己如何使用线程,以便线程可以相互通信

0 投票
1 回答
1753 浏览

android - 不断检查互联网连接,如果连接,运行代码(Android)

我想不断检查互联网连接并更改TextView连接是否出现或消失。但是在TextView我刷新应用程序之前不会改变。这是我当前的代码:

isInternetOn()代码:

0 投票
2 回答
9000 浏览

android - 用 Looper.getMainLooper() 初始化的处理程序不响应消息回调

我正在尝试实现从不同线程监听同一个 Looper 的处理程序。

下面我有两个处理程序,一个在主线程中创建,另一个在子线程中创建,但是两者都被初始化为在 Main Looper 上侦听。

但是当我发送如下消息时,只有子处理程序会打印消息。主处理程序没有收到消息。

我究竟做错了什么?感谢您的阅读。

0 投票
2 回答
167 浏览

java - Looper.loop 未调用,但处理程序中的代码仍在执行

我试图了解 looper.loop 是如何工作的,以及何时在我的代码中使用它。我有一个可运行的绑定服务。在里面我有一个处理程序,用于保存更新 Ui 的代码。这是代码。

  1. 从我读到的looper。prepare 必须在处理程序生成之前调用。但我注意到我没有这样做,但这段代码仍然有效。这怎么可能?
  2. 我想解决这个问题,但我不确定将 loper.loop 放在哪里。因为这个处理程序被多次调用。如果我将 looper.loop 放在 .prepare 之后可以吗?那么.quit什么时候isThreadStarted == false?
0 投票
1 回答
663 浏览

android - 使用来自 UI 的消息在循环时中断线程

我确信我的问题的解决方案将是那些“duh”时刻之一,但我被困住了,所以任何有用的提示都会被感激地收到。

问题:我有一个带有后台线程的 UI。UI 有一个启动/停止按钮,用于启动和停止线程中的进程。这是使用从 UI 到包裹在循环器中的线程中的消息处理程序的消息来实现的。线程进程处于依赖于线程消息处理程序设置的布尔值 true/false 的 while 循环中。但是,一旦开始,就不会再处理任何消息,并且循环会无限继续。

我在 UI 的 STOP 消息上收到了一条 logcat 消息,并且正在触发,但是线程永远不会拾取它,因为它卡在 while 循环中并且消息处理程序没有得到查看。

有没有办法让线程处理程序在各个点检查来自 while 循环内的消息?或者是否有另一种方法可以根据来自 UI 的消息来启动和停止基于线程的连续 while 循环?

干杯安迪

0 投票
2 回答
1885 浏览

android - 显示 ProgressDialog、运行 worker 并等待 worker 完成的 Android 方法

我需要编写显示 ProgressDialog 的静态方法,在线程中运行 worker 并且在 worker 完成后 ProgreesDialog 必须关闭并且我的方法返回 worker 所做的。这是我的代码:

一切正常,但 ProgressDialog 不会解雇。我怀疑 looper.quit() 做错了什么,但我需要停止 Looper.loop()。我调用 loop() 因为我需要立即显示 ProgressDialog。

0 投票
0 回答
1245 浏览

android - Android AsyncTask 与 Looper 处理程序

我已经实现了每 5 秒查询一次数据库的后台服务。如果查询没有返回结果,服务应该等待 5 秒并再次查询数据库。如果查询返回结果,它应该调用一个活动并将结果传递给它。

我从一个 AsyncTask 开始,它基本上读取 doInBackground() 中的数据库并返回结果,以便 onPostExecute() 调用活动。现在我在服务的 onStartCommand() 中调用 AsyncTask.execute() 。但这意味着该任务仅在服务启动时被调用一次。

我是否应该为我的任务使用 Looper/Handler,类似于此处解释的内容: How to run an async task for every x mins in android?

但是,如果我正确理解了该代码,该服务将需要在某个地方循环调用 startRepeatingTask,但我希望 doSomething() 本身可以每 x 分钟调用一次。

我是 Android 新手,如果问题非常基本,或者我只是不理解其他解决方案,我很抱歉,希望有人能解释一下这是否适用于我的情况!

谢谢!

0 投票
1 回答
2338 浏览

android - 具有自己的 Handler/Looper 的 Android 工作线程

我想要一个工作线程,它可以 1)向 UI 线程发送消息以更改 GUI 中的内容,以及 2)从 UI 线程接收消息以控制工作线程的行为。

第一部分很简单:在 UI 线程中创建一个 Handler,让工作线程向它发送消息。奇迹般有效。工作线程使用 Thread.sleep() 执行有效的延迟,唤醒“做事”,向 UI 线程的 Handler 发送更新,然后重复。

下一部分在 Android 中显然是困难的。工作线程必须有一个 Looper 才能创建一个 Handler 以便它可以接收消息,并且 Looper.loop() 是一个阻塞调用,这意味着工作线程现在 100% 致力于运行 Looper 并且不能做其他事情当前正在做(“做事”,发送更新消息,睡眠,重复)。

这意味着我需要一个第三个线程来为工作线程运行 Looper,这很荒谬。应该可以让工作线程做有用的事情,并在消息到达时处理消息。这产生了一个具有最少线程对象和最小开销的高效系统。我不知道如何在 Android 中实现这种行为。

那么......工作线程如何支持处理程序并做其他有用的事情?谢谢!

0 投票
2 回答
10746 浏览

android - LocationManager: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

Normally an error while doing something on the UI thread from another thread I thought, but I don't get what I'm doing wrong. The error seems only to appear when the phone is travelling, so with a changing GPS location.

I want the most recent location to be stored, so nothing on the UI. I have the following method called from the main activity:

The error I get is:

Line 97=locationManager.requestLocationUpdates(s, interval,minDistance, listener); (LocationManager class)

Seems like I have to call Looper.prepare(); and Looper.loop(); somewhere, but I don't see where? It might have something to do with this question AsyncTask and Looper.prepare() error

0 投票
2 回答
3863 浏览

android - 在 Android 上找不到源

每当我尝试调试我的应用程序时,Eclipse 都会打开 aClass File Editor并给出 a Source not Foundand 通常用于基本的 Java 类(例如 Looper.class)。我真的厌倦了这一点。Source not Found由于这些s ,我无法很好地调试。有没有办法解决这个问题?

谢谢!