问题标签 [android-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 投票
0 回答
132 浏览

java - 用于测试实时 Android 应用程序的桌面库

我为 Android 编写了一个实时应用程序,它每秒接收数百个输入事件并每秒吐出几个输出事件。输入事件驱动状态机产生输出事件。每次运行时,我都会将输入和输出事件写入一个文件。我想使用我认为对回归测试有效的运行文件。我会将记录的输入事件提供给系统并寻找预期的输出事件。

我的系统通过循环器/处理程序接收事件并使用计时器,但它不依赖于 Android API,除了android.util.log用于调试目的,我可以轻松包装。

哪个桌面框架将为我提供所需的 API?JUnit 测试就足够了吗?这需要进行仪器测试吗?我真的需要运行某种模拟库吗?这是我的第一个 Android 应用程序,我还在摸索。

理想情况下,我会用 Java 编写一个命令行工具,这样我就可以改变控制测试的参数。我怀疑我想到的测试类型是否适合任何通用测试框架,因为需要一些智能来决定何时尝试将实际结果与预期结果相匹配以及何时停止测试运​​行。我怀疑我只是在寻找合适的桌面库。

我想我知道如何编写另一个可以完成这项工作的 Android 应用程序,但这看起来比从 shell 中执行要复杂得多,而且使用起来也不太方便。我的备用计划是使用常规 Java 线程消息传递在 looper API(我的库的公共 API)下测试我的系统。(我想在原始时间向系统提供事件。)

更新:当我四处寻找答案时,很明显我可以编写一个运行我所有实时测试的 JUnit 测试,但对慢仿真的抱怨让我很担心。在这些测试中,时间是至关重要的。另一方面,台式计算机可能会运行干扰计时的后台进程,所以也许我必须创建一个在设备上运行的测试工具。希望给点建议...

0 投票
1 回答
104 浏览

android - 线程仅在 Android 的发布模式下冻结 UI

在我的应用程序中,我们正在创建一个通过蓝牙打印机进行打印的线程。它在调试模式下工作正常,但在发布模式下它给出了 ANR 错误。我正在从服务启动线程。我正在使用以下代码:

在棒棒糖版本中,它工作正常,它只是在 Marshmellow 版本中出现问题,在发布模式下也是如此。

0 投票
0 回答
347 浏览

java - 如何在 Android Studio 中存根 android.os 类?

我为 Android 编写了一个实时子系统,我想在桌面上进行测试。我想通过我创建的命令行工具运行测试。该子系统依赖于Android如下:

  • android.os.Looper
  • android.os.Handler(包括Handler.Callback)
  • android.os.Message
  • android.util.Log

我需要存根这些类。Robolectric存根这些类,但显然不允许 Looper 的自定义实例。除非有人能指出我的功能存根,否则我打算自己编写它们。我宁愿避免为完整的 Android 模拟器编写测试工具的复杂性。

如何让 Android Studio 在我的工具构建中将我的存根用于这些类?我不想修改子系统以动态接收它应该使用的类,因为害怕限制优化或使代码不必要地混乱。(但我愿意包装 android.util.Log。)

谢谢你的帮助!

0 投票
1 回答
818 浏览

android - Handler / Looper / 向线程发送消息

我编写了一个测试应用程序来了解线程之间的通信机制。

我的消息来源:

http://techtej.blogspot.de/2011/02/android-passing-data-between-main.html向正在监听网络数据的线程发送消息

我不明白如何使用 Handler 和 Looper。

这里:(每一步都应该给出他的状态:Log.v(TAG, "..."))

  • MainActivity 创建并启动 Thread (Runnable "r")
  • MainActivity --> 消息到 --> r
  • MainActivity <-- 修改消息 <-- r

日志猫:

--------- 崩溃开始 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.desktop.testhandlerlooper, PID: 2872 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.desktop .testhandlerlooper/com.example.desktop.testhandlerlooper.MainActivity}:java.lang.NullPointerException:尝试在 android.app 的空对象引用上调用虚拟方法 'android.os.Message android.os.Handler.obtainMessage()' .ActivityThread.performLaunchActivity(ActivityThread.java:2416) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage (活动线程.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 的 lang.reflect.Method.invoke(Native Method) ) 引起:java.lang.NullPointerException:尝试在 com.example.desktop.testhandlerlooper.MainActivity.onStart(MainActivity .java:35) 在 android.app.Instrumentation。callActivityOnStart(Instrumentation.java:1237) 在 android.app.Activity.performStart(Activity.java:6253) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java :2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(Native Method) 在 com。com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 处的 android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 应用程序终止。

除了我正在尝试做的事情之外,我了解错误但不知道如何解决它。也许 MainThread 和 ChildTread 两者之间的同步?

0 投票
0 回答
65 浏览

android - 将 Toast 与 Intent 服务一起使用时的重复消息

我正在显示来自 IntentService 的 Android Toast 消息。经过一番研究和了解 Loopers、Handlers 和 Message queues 是如何工作的,我实现了这里找到的解决方案:Toast on an IntentService

我发现除了最新的toast,之前的toast消息都是按顺序显示的。谁能解释发生了什么以及如何解决这个问题?

0 投票
1 回答
77 浏览

android - 如何从上下文值中知道哪个活动当前正在前台运行?

我有一个棘手的情况。我会尽量以最好的方式充分解释它。

我的应用程序很少有活动,比如 A、B、C。A 是主要活动,B 和 C 从 A 调用。所以基本上当 B 或 C 运行时,A 将停止(onStop())。

我在我的应用程序中使用了一个 android 库(由我创建)。我的图书馆保存了活动的上下文。例如,当我们使用活动 A 打开应用程序时,我的库将保存 A 的上下文,并将使用该上下文创建一个处理程序并将它们保存在 Map( Map<Context, Handler>) 中。现在,如果我们导航到活动 B,我的库将获取 B 的上下文,然后在地图中为此创建一个新条目。

在某个时间点,我将使用 Map 中的处理程序来发布一些可运行文件。显然,A 和 B 都将收到,因为它们都在运行(一个在后台和前台)。

  1. 但是我怎样才能检查并只发送给在前台运行的那个?是否可以从上下文值检查活动当前是正在运行还是已停止?

  2. this.getMainLooper当从 A 和 B 调用时返回相同的东西吗?

更新:对不起,我错过了这一点。该应用程序是关于如何使用我的库的演示应用程序。所以我将来会发布我的库,开发人员会使用它。因此,我不希望开发人员这样做,如果我能在我的库本身中做到这一点,那将是最好的。

0 投票
1 回答
98 浏览

android - 在 Looper.loop() 之后不执行 onPostExecute()

doInBackground() 工作正常.. Looper.loop() 之后的代码将不起作用。在 Looper.Loop() 之后日志不打印并且不执行 onPostExceute()。我需要等到方法 1,2,3 执行。如果没有使用 Looper.prepare(),method1 会发生异常。

0 投票
2 回答
83 浏览

java - 我的 Android UI 无法运行?

我实现了 AsyncTask 来执行结果。这是我得到的错误...

我看过关于“Looper.prepare()”的不同 SOF 帖子,但问题是,在将静态变量更改为 getter/setter 方法之前,我的 UI 工作正常。

这是我的代码...

有人可以解释发生了什么吗?Android Studio 的新手,在 Java 中只开发了 3 个月,所以对于任何解决方案,我也可以请求解释一下吗?非常感谢谢谢

更新:

这是我的主要活动...

}

如您所见,可以使用 getter 和 setter 访问存储用户输入的数组列表,而不是将数组列表设置为静态(我之前做过)。我在另一个名为 CustomUseCase 和 CustomService 的类中访问这些数组列表。这是 customUseCase 的代码:

这是我的 CustomService 类:

0 投票
1 回答
1502 浏览

java - Android:如何从主线程创建消息并将其传递给工作线程

我是 android 和 java 中的多线程的新手,我很难实现一个简单的模型,在这个模型中我们可以启动工作线程并从主线程发送一些消息或可运行到工作线程,在那里它执行一些操作并将结果发送到主线程和更新ui线程

我试过这个:

主要活动:

0 投票
0 回答
93 浏览

android - RealmResult 不自动更新

我有一个正在更新的 RealmResults 对象,但问题是它没有实时更新。

代码...

sendPendingMessages是包含 realmresult 对象的函数。

我创建了一个服务来与服务器同步数据,由于它在不同的线程上,我需要打开另一个领域实例来在本地更新数据,以便它知道数据已经同步

服务的 OnSuccessCall

在服务成功后,realmresults 对象正确反映了更改,因此messages_middle的大小小于消息,因为数据已同步,但是当我在同步数据后检查服务外部消息的大小时,它仍然显示原始大小和原始数据。