问题标签 [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.
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; }
android - 如何创建一个 Looper 线程,然后立即向它发送消息?
我有一个位于后台的工作线程,处理消息。像这样的东西:
从主线程(UI线程,没关系)我想做这样的事情:
麻烦的是,这为我设置了一个漂亮的竞争条件:在worker.handler
读取时,无法确定工作线程已经分配给这个字段!
我不能简单地Handler
从Worker
的构造函数中创建,因为构造函数在主线程上运行,所以Handler
会与错误的线程相关联。
这似乎并不罕见。我可以想出几个解决方法,所有这些都很难看:
像这样的东西:
从主线程:
但这也不可靠:如果
notifyAll()
发生在 之前wait()
,那么我们将永远不会被唤醒!将初始值传递
Message
给Worker
的构造函数,让run()
方法发布它。临时解决方案不适用于多条消息,或者如果我们不想立即发送,但很快就会发送。等到
handler
田野不再忙碌null
。是的,最后的手段...
我想创建一个Handler
和MessageQueue
代表Worker
线程,但这似乎是不可能的。最优雅的方法是什么?
android - 如何在 Android 上进行非阻塞事件处理?
这个问题是关于 Android 上的事件处理。它不是特定于 c++ 的。
我需要处理 UI/OS 事件,而不是在处理完所有事件后阻塞。
原因是我正在移植的应用程序非常大,并且不能轻易地被重写以在工作线程上处理它自己的东西。相反,应用程序引擎要求在冗长的操作期间处理 UI/OS 事件,否则这些操作会阻塞。
我发现 ALooper_pollAll(...) 不适合我。例如,如果我在我的活动中创建一个对话框并开始一个长操作,ALooper_pollAll() 不会让我的对话框出现 - 它只会在我返回主循环时显示(我在 onNativeWindowCreated 中测试过)。
我发现几乎可行的唯一解决方案是通过 JNI 调用以下代码在 UI 线程上执行内部循环:
然而,这不是一个最佳解决方案,因为在没有更多事件要处理之前它不会循环(因为在循环运行期间可能会创建事件)。
在我的研究中,我发现我可以从 Looper 中获取 MessageQueue 并添加一个可以退出我的内部循环的 IdleHandler。我还没有尝试过,必须有更好的方法。
鉴于这是我必须坚持的架构,什么是更好的解决方案?
更新:
使用 MessageQueue 我能够实现我所需要的:
但是,我仍然想知道是否有更好的解决方案。
android - 在类中创建处理程序而不会出现错误“循环器未准备好”?
在我的游戏中,有一个游戏对象类需要使用Handler来发布延迟Runnable。但是,我尝试在对象类中创建处理程序的所有内容都收到错误消息:
无法在未调用 Looper.prepare() 的线程内创建处理程序
我用谷歌搜索了一些解决方案,但他们都使用另一种解决方案,而不是 Handler。有没有在普通类中使用 Handler 的解决方案?或者在确定的延迟后运行 Runnable 的任何解决方案?
我不能使用睡眠,因为它暂停了我所有的游戏!
谢谢你。
android - Android中的Handler-Looper实现
- 我有处理程序的活动(UI 线程)
- 我启动新线程并制作 handler.post(new MyRunnable()) - (新工作线程)
Android 文档说关于 post 方法:“导致 Runnable r 被添加到消息队列中。runnable 将在此处理程序附加到的线程上运行。”
附加到 UI 线程的处理程序。android如何在不创建新线程的情况下在同一个UI线程中运行runnable?
是否将使用来自 handler.post() 的 Runnable 创建新线程?还是只会从 Runnable 子类调用 run() 方法?
android - Android:以固定间隔拉取位置崩溃,Looper Prepare(是的,我搜索过!!)
我正在尝试定期提取位置并通过网络发送。在此之前,我觉得验证我是否正确拉动位置很重要!为此,我尝试提取该位置并向在屏幕上显示的处理程序发送一条消息。我到处搜索,实际上在堆栈溢出时使用了一个非常有用的代码段(非常感谢!)在 Android 上获取用户当前位置的最简单、最可靠的方法是什么?
继承人一些代码:
MyLocation(来自示例):
现在,当我像这样使用它时,它可以正常工作(以下是 Main 活动类中的代码):
但是我想定期执行此操作,所以我有这样的事情(以下代码在主活动类中,这次实现 Runnable):
注意:threadHandler 属于 MyHandler 类型,定义如下:
我收到有关从尚未调用 Looper.prepare() 的线程写入处理程序的错误。我尝试在我的活动和线程的各个部分添加 Looper.prepare() 和 Looper.loop() 无济于事。我尝试使用计时器而不是 run() + sleep()。
稍后,我将将该位置插入队列,而不是写入线程处理程序。另一个处理套接字连接的线程将检查队列是否为空。如果它有一个元素,它将 dequeue() 并将其发送出去。
请给我一些建议。
java - 在 Android 中的线程内创建处理程序
我试图从线程中显示吐司。
但抛出异常
我该如何解决这个问题?Looper.myLooper().prepare();
我已经把Toast.makeText(....).show();
完成此操作后,它不会引发异常,但不会显示任何 toast 消息。
那么我该如何解决这个问题呢?
提前致谢。
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代码中会发生什么?
对这些问题的任何指示和答案都将非常有帮助。在此先感谢您的帮助。
干杯
android - 如何管理 Loopers 和线程(线程不再死了!)
我创建了一个扩展 Thread 的类,以在非 UI 线程中通过 LocationManager 检索用户位置。我将其实现为一个线程,因为它必须根据请求启动并在有限的时间内完成它的工作。顺便说一句,我必须在线程中添加一个 Looper 对象,以便能够为 LocationManager (onLocationChanged) 创建处理程序。
这是代码:
我希望线程启动,接收用户位置数据(在这种情况下只是一次),通过消息将数据发送到主线程到处理程序,然后死亡。问题是,在我的情况下,线程不再死亡,一旦 run 方法结束(这应该没问题,因为否则 onLocationChanged 将不会接收新位置)。
但是以这种方式,假设线程的停止和挂起方法已被弃用,那么至少在这种情况下,使带有活套的线程死亡的好方法是什么?
提前致谢 ;)
android - 如何从单独的线程正确调用 AsyncTask?
我正在开发一个游戏,它在一个单独的线程中运行。现在我需要从 Internet 下载图像。我为此编写了一个AsyncTask
类,但我不知道如何从我的游戏线程中正确调用它?事实上,我AsyncTask
正在阻止,尽管我需要在下载图像之前等待。如果我使用runOnUIThread
,它不会阻塞我的线程并走得更远,这根本不适合我。我也试过Looper.prepare()
在运行之前使用AsyncTask
,但这也有一些麻烦:Looper.myLooper().quit()
似乎没有工作,如果我再次尝试调用AsyncTask
,我会收到一个异常,告诉我我正在尝试调用Looper.prepare()
第二个时间。我应该如何进行?提前致谢。