问题标签 [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 回答
2814 浏览

android - StrictMode 混乱 - 这是怎么回事?

我的问题:

12-18 17:05:03.336: DEBUG/StrictMode(2112): StrictMode 策略违规;~duration=2073 毫秒:android.os.StrictMode$StrictModeDiskReadViolation:策略=23 违规=2

从工厂方法

12-18 17:05:03.336:调试/严格模式(2112):在 android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:299)

然后在我的代码中

12-18 17:05:03.336:调试/严格模式(2112):在 blah.ImageCache.getFromCache(ImageCache.java:248)

12-18 17:05:03.336:调试/严格模式(2112):
在 blah2$LoaderThread$1.handleMessage(blah.java:63)

重要的片段

类 LoaderThread 扩展 HandlerThread {

公共处理程序 mHandler;

public LoaderThread(String name) { super(name); }

@Override public void onLooperPrepared(){ mHandler = new Handler(){ public void handleMessage(Message msg) { Bitmap bit =ImageCache.getInstance().getFromCache((String)msg.obj,ImageCache.USE_DISK); } }; } }

The getFromCache method in the ImageCache class calls

Which seems to be running on the UI thread, but it makes no sense to me. Shouldn't this be getting called on a background thread? This was the goal of using HandlerThread after all...

The LoadThread class is created in my onCreate(bundle) like this

LoaderThread loader = new LoaderThread("imgLoader")

loader.start();

and messages are passed from the UI thread via the handler

loader.mHandler.dispatchMessage(loader.mHandler.obtainMessage(args..));

I'm wondering if this has to do with the getInstance method which is static

public static synchronized ImageCache getInstance() {

if (_instance==null) { _instance = new ImageCache(); } return _instance; }

0 投票
4 回答
45893 浏览

android - 如何创建一个 Looper 线程,然后立即向它发送消息?

我有一个位于后台的工作线程,处理消息。像这样的东西:

从主线程(UI线程,没关系)我想做这样的事情:

麻烦的是,这为我设置了一个漂亮的竞争条件:在worker.handler读取时,无法确定工作线程已经分配给这个字段!

我不能简单地HandlerWorker的构造函数中创建,因为构造函数在主线程上运行,所以Handler会与错误的线程相关联。

这似乎并不罕见。我可以想出几个解决方法,所有这些都很难看:

  1. 像这样的东西:

    从主线程:

    但这也不可靠:如果notifyAll()发生在 之前wait(),那么我们将永远不会被唤醒!

  2. 将初始值传递MessageWorker的构造函数,让run()方法发布它。临时解决方案不适用于多条消息,或者如果我们不想立即发送,但很快就会发送。

  3. 等到handler田野不再忙碌null。是的,最后的手段...

我想创建一个HandlerMessageQueue代表Worker线程,但这似乎是不可能的。最优雅的方法是什么?

0 投票
1 回答
2589 浏览

android - 如何在 Android 上进行非阻塞事件处理?

这个问题是关于 Android 上的事件处理。它不是特定于 c++ 的。

我需要处理 UI/OS 事件,而不是在处理完所有事件后阻塞。

原因是我正在移植的应用程序非常大,并且不能轻易地被重写以在工作线程上处理它自己的东西。相反,应用程序引擎要求在冗长的操作期间处理 UI/OS 事件,否则这些操作会阻塞。

我发现 ALooper_pollAll(...) 不适合我。例如,如果我在我的活动中创建一个对话框并开始一个长操作,ALooper_pollAll() 不会让我的对话框出现 - 它只会在我返回主循环时显示(我在 onNativeWindowCreated 中测试过)。

我发现几乎可行的唯一解决方案是通过 JNI 调用以下代码在 UI 线程上执行内部循环:

然而,这不是一个最佳解决方案,因为在没有更多事件要处理之前它不会循环(因为在循环运行期间可能会创建事件)。

在我的研究中,我发现我可以从 Looper 中获取 MessageQueue 并添加一个可以退出我的内部循环的 IdleHandler。我还没有尝试过,必须有更好的方法。

鉴于这是我必须坚持的架构,什么是更好的解决方案?

更新:

使用 MessageQueue 我能够实现我所需要的:

但是,我仍然想知道是否有更好的解决方案。

0 投票
1 回答
1620 浏览

android - 在类中创建处理程序而不会出现错误“循环器未准备好”?

在我的游戏中,有一个游戏对象类需要使用Handler来发布延迟Runnable。但是,我尝试在对象类中创建处理程序的所有内容都收到错误消息:

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

我用谷歌搜索了一些解决方案,但他们都使用另一种解决方案,而不是 Handler。有没有在普通类中使用 Handler 的解决方案?或者在确定的延迟后运行 Runnable 的任何解决方案?

我不能使用睡眠,因为它暂停了我所有的游戏!

谢谢你。

0 投票
2 回答
3908 浏览

android - Android中的Handler-Looper实现

  1. 我有处理程序的活动(UI 线程)
  2. 我启动新线程并制作 handler.post(new MyRunnable()) - (新工作线程)

Android 文档说关于 post 方法:“导致 Runnable r 被添加到消息队列中。runnable 将在此处理程序附加到的线程上运行。”

附加到 UI 线程的处理程序。android如何在不创建新线程的情况下在同一个UI线程中运行runnable?

是否将使用来自 handler.post() 的 Runnable 创建新线程?还是只会从 Runnable 子类调用 run() 方法?

0 投票
1 回答
2086 浏览

android - Android:以固定间隔拉取位置崩溃,Looper Prepare(是的,我搜索过!!)

我正在尝试定期提取位置并通过网络发送。在此之前,我觉得验证我是否正确拉动位置很重要!为此,我尝试提取该位置并向在屏幕上显示的处理程序发送一条消息。我到处搜索,实际上在堆栈溢出时使用了一个非常有用的代码段(非常感谢!)在 Android 上获取用户当前位置的最简单、最可靠的方法是什么?

继承人一些代码:

MyLocation(来自示例):

现在,当我像这样使用它时,它可以正常工作(以下是 Main 活动类中的代码):

但是我想定期执行此操作,所以我有这样的事情(以下代码在主活动类中,这次实现 Runnable):

注意:threadHandler 属于 MyHandler 类型,定义如下:

我收到有关从尚未调用 Looper.prepare() 的线程写入处理程序的错误。我尝试在我的活动和线程的各个部分添加 Looper.prepare() 和 Looper.loop() 无济于事。我尝试使用计时器而不是 run() + sleep()。

稍后,我将将该位置插入队列,而不是写入线程处理程序。另一个处理套接字连接的线程将检查队列是否为空。如果它有一个元素,它将 dequeue() 并将其发送出去。

请给我一些建议。

0 投票
1 回答
994 浏览

java - 在 Android 中的线程内创建处理程序

我试图从线程中显示吐司。

但抛出异常

我该如何解决这个问题?Looper.myLooper().prepare();我已经把Toast.makeText(....).show();

完成此操作后,它不会引发异常,但不会显示任何 toast 消息。

那么我该如何解决这个问题呢?

提前致谢。

0 投票
1 回答
4072 浏览

android - 为什么Android服务需要在UI线程上运行?

我有一个可能很简单的问题。我有一个安卓服务;我在其中创建了一个通用服务类,它请求锁定并在单独的线程中执行实际(扩展)服务代码。下面的例子:

在上面的例子中;即使 Looper.prepare() 和 Looper.loop() 没有在被调用的线程中调用,一切正常。

但是,如果我尝试通过 GPS 或网络获取位置;然后我有一个问题,代码没有运行说“无法在没有调用 Looper.prepare() 的线程内创建处理程序”。

我知道我们需要创建循环器和处理程序来与 UI 线程通信;对于影响 UI 的事件。但是获取位置会影响 UI 吗?是不是因为位置提供者也会尝试在我的手机顶部栏上绘制一个 GPS 图标,并且因为它没有在 UI 线程中运行;它不能那样做吗?

这里有什么问题,我可以通过调用 looper.prepare() 和 Looper.loop() 来解决这个问题;但是我需要了解以下内容?

  • 我知道服务在主线程上运行,与 UI 线程相同;这是否有效地意味着,服务有能力对 UI 进行更改,我们不这样做是因为它不是良好的用户体验,这就是为什么通过通知传达所有内容?(甚至通知也需要在 UI 线程上运行?)
  • 为什么位置提供程序需要在 UI 线程上运行?
  • 我没有在这里声明任何处理程序,我只是在调用 looper.prepare(); 那么消息队列如何在后台工作以及在下面的android代码中会发生什么?

对这些问题的任何指示和答案都将非常有帮助。在此先感谢您的帮助。

干杯

0 投票
5 回答
16937 浏览

android - 如何管理 Loopers 和线程(线程不再死了!)

我创建了一个扩展 Thread 的类,以在非 UI 线程中通过 LocationManager 检索用户位置。我将其实现为一个线程,因为它必须根据请求启动并在有限的时间内完成它的工作。顺便说一句,我必须在线程中添加一个 Looper 对象,以便能够为 LocationManager (onLocationChanged) 创建处理程序。

这是代码:

我希望线程启动,接收用户位置数据(在这种情况下只是一次),通过消息将数据发送到主线程到处理程序,然后死亡。问题是,在我的情况下,线程不再死亡,一旦 run 方法结束(这应该没问题,因为否则 onLocationChanged 将不会接收新位置)。

但是以这种方式,假设线程的停止和挂起方法已被弃用,那么至少在这种情况下,使带有活套的线程死亡的好方法是什么?

提前致谢 ;)

0 投票
2 回答
1728 浏览

android - 如何从单独的线程正确调用 AsyncTask?

我正在开发一个游戏,它在一个单独的线程中运行。现在我需要从 Internet 下载图像。我为此编写了一个AsyncTask类,但我不知道如何从我的游戏线程中正确调用它?事实上,我AsyncTask正在阻止,尽管我需要在下载图像之前等待。如果我使用runOnUIThread,它不会阻塞我的线程并走得更远,这根本不适合我。我也试过Looper.prepare()在运行之前使用AsyncTask,但这也有一些麻烦:Looper.myLooper().quit()似乎没有工作,如果我再次尝试调用AsyncTask,我会收到一个异常,告诉我我正在尝试调用Looper.prepare()第二个时间。我应该如何进行?提前致谢。