问题标签 [android-threading]

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 回答
31 浏览

java - AsyncTask 正常工作的线程规则,规则 1 和规则 5?

我试图通过 android 提供的有关 AsyncTask 的文档,即使它有点难以理解,但我遇到的是 AsyncTask 正常工作的线程规则。

我在这里粘贴链接;https://developer.android.com/reference/android/os/AsyncTask.html#threading-rules

这是规则;

要使此类正常工作,必须遵循一些线程规则:

  1. AsyncTask 类必须在 UI 线程上加载。这从 Build.VERSION_CODES.JELLY_BEAN 开始自动完成。

  2. 任务实例必须在 UI 线程上创建。

  3. 必须在 UI 线程上调用 execute(Params...)。

  4. 不要手动调用 onPreExecute()、onPostExecute(Result)、doInBackground(Params...)、onProgressUpdate(Progress...)。

  5. 该任务只能执行一次(如果尝试第二次执行 i 将引发异常。)

我也理解规则 2、3 和 4。

我不明白的是规则1和5。

扩展 AsyncTask 的类是在 UI 线程上创建的实例(例如 onCreate()) - 规则 2

他们想在规则 1 中说什么?
它是如何在我们从未提及的情况下自动加载的?

根据规则 5,他们是否说,扩展 AsyncTask 的类的单个实例可以执行一次,如果我们想再执行一次,我们是否必须创建同一个类的另一个实例?

谢谢

0 投票
0 回答
64 浏览

android - 是什么导致 ANR 在主线程上没有长任务?

我们的游戏应用程序还有一些剩余的 ANR,它们不属于明显的“在主线程上做一些繁重的事情”场景,但它仍然停止服务输入事件的主线程。

例如主线程是:

据我所知,如果主线程处于空闲状态,而不是阻塞工作,这是标准的循环器响应。

唯一的其他游戏线程是通过标准 GLSurfaceView 创建的,因此有一个 GLThread,它也在等待。调用堆栈表明 GLThread 在执行 C++ NativeTick() 函数之前也在等待。

锁正在等待将一些工作添加到 looper。那么为什么是 ANR?

即使所有其他线程具有相似或较低的优先级,是否有可能另一个线程正在停止主线程的服务?

0 投票
1 回答
19 浏览

android - 在前台服务中运行的 ScheduledThreadPoolExecutor 的 poolsize

在我的前台服务中,我需要连接到我的后端以每 3 分钟下载一次最新数据并在通知中显示数据。经过几分钟的谷歌搜索,似乎使用“ScheduledThreadPoolExecutor”是最好的。但我仍然不清楚池大小应该放什么。

在决定池大小时应该考虑什么?基本上我的前台服务将做的是:

  1. 每 180 秒连接一次 API
  2. 使用 Room 将数据保存在 db 中
  3. 显示通知下面是我的一些代码:
0 投票
0 回答
119 浏览

android - 使用 ExtractMpegFramesTest 在 Android 上提取视频帧并运行计算密集型函数而不是保存为图像

在 Android 上,我想提取视频的所有帧并在每一帧上从 boofcv运行对象跟踪功能。因此,我使用了ExtractMpegFramesTest示例,并对其稍作调整以在每个帧上运行跟踪,而不是将帧保存为 png。即不是调用 outputSurface.saveFrame(),而是调用 outputSurface.processFrame(),我实现如下:

一旦我注释掉 tracker.process(img, location) 行,代码就可以完美运行。一旦我包含跟踪,我就没有收到错误消息,但也没有任何反应。应用程序在跟踪第一张图像时卡住了,logcat 输出如下所示:

tracker.process() 函数本身可以完美运行,例如在使用 MediaMetadataRetriever 提取帧时(但是 MediaMetadataRetriever 太慢,这就是我使用 ExtractMpegFrames 的原因)。在我的设备上,tracker.process() 函数本身通常每帧需要大约 30-40 毫秒。只需使用 ExtractMpegFrames 将帧提取为位图,无需进一步处理,每帧大约需要 3-4 毫秒。

所以我猜这个问题可能与线程有关?我会感谢每一个帮助。

编辑

在我的 UI 线程上,我正在调用new ExtractMpegFrames().run()ExtractMpegFrames 类,如下所示:

编辑 2

我仍然没有解决这个问题。我试图用一个 opencv (org.opencv.tracking.TrackerMOSSE)替换 boofcv 跟踪器。但是,这也会导致死锁(与上面的 logcat 输出相同)。最后,我尝试用这个 opencv 模板匹配算法替换跟踪功能。这有效并且不会导致死锁,但是它太慢了(在我的设备上每帧大约需要一秒钟)。

0 投票
0 回答
21 浏览

android - 内容提供者 - 使用

我从未在内容提供商工作过。所以,我对它有一个基本的定义知识。我对他们的了解是,

内容提供者管理对结构化数据集的访问。并且,它封装了数据并提供了定义数据安全性的机制。它是将一个进程中的数据与另一个进程中运行的代码连接起来的标准接口。

谁能给我一个实际的例子来表示内容提供者的实时使用来准确理解它?

0 投票
0 回答
70 浏览

java - 当应用程序处于后台时,android线程一直滞后

我正在开发一个 WebRTC 流媒体应用程序。这个想法是从麦克风捕获信号,进行一些实时 C/C++ 处理 (JNI),并将处理后的信号流式传输到服务器。当应用程序处于前台时,该过程按预期工作。但是,它开始滞后,应用程序进入后台的那一刻,或者当我锁定手机时。

我已将优先级设置为 Process.THREAD_PRIORITY_URGENT_AUDIO 但它仍然滞后。对于如何解决滞后问题,我们将不胜感激。

Update1:​​我注意到当应用程序在后台时,process_time(C/C++ 代码处理音频缓冲区的时间)变成了两倍。我不明白这种行为!

更新 2:此行为不会在 Android 模拟器上发生,但会在我的实际 Android 设备(OnePlus Nord N200)上发生

Update3:正如@emandt 所建议的,我在前台和后台模式下分析了 CPU 使用率。CPU 利用率保持不变,而功耗明显下降。这可能表明应用程序在后台时 CPU 时钟速度受到限制?

在此处输入图像描述

0 投票
0 回答
17 浏览

android - Android ContentProvider 接收端:是否需要线程?

当我扩展 ContentProvider 并实现 call() API 时:

如果我在例如 call() 调用(接收端)中执行一个长时间运行的进程,那会以某种方式停止/破坏 ContentProvider 应用程序/进程吗?即 call() 调用是在线程池中处理的,而不是在 UI 线程上处理的,只要我想在 call() 实现中做任何我想做的事情,我就可以安全地做任何事情?

我看到有些人从 call() 方法中旋转线程,但这在接收端不应该真的是必需的,对吧?只有在调用方我们必须这样做,对吗?

0 投票
1 回答
140 浏览

android - Choreographer: Skipped frames : 应用程序可能在其主线程上做太多工作

在我的 android 应用程序中,我收到“应用程序可能在其主线程上做太多工作”作为警告和 api 调用需要很长时间才能做出响应。我用一个例子展示了它。我有一个单选按钮,每个按钮有 2 个案例将在点击时进行 api 调用,结果将向用户显示数据列表。下面是我的代码。

ServerAuthenticateService.java :

下面是我得到的变暖。

在我的应用程序中,我有很多 API 调用,并且大多数时候我都会收到此警告,我应该怎么做才能避免这种情况并使我的请求和应用程序运行得更快?

0 投票
0 回答
21 浏览

java - 如何从 Volley 请求中更新 UI

在 Android Studio 上,我正在开发一个应用程序连接到扫描仪的项目。扫描仪拍摄手指的照片并将其发送到应用程序。问题是,我想告诉用户他可以在拍照时移开手指。但是该消息仅在所有计算结束时打印。这是代码:

问题是,消息在最后打印,同时显示图像。我希望在将手指放在扫描仪中不再有用的那一刻打印它。

我尝试使用 Runnable,我尝试了 runOnUiThread,但似乎没有任何效果。

有谁知道我该怎么办?

0 投票
1 回答
148 浏览

android - Android View Binding in Thread 错误 NullPointerException

我已将代码切换到 View Binding,但现在在线程中更新 UI 时遇到问题。该代码在合成语法中运行良好。我收到错误:

我的代码:

当我切换到不同的片段时出现错误。如果我是对的,线程在 onDestroyView () 之后运行并且绑定为空。我想出了暂停 onDestroyView 直到 Thread 完成的想法,但我认为这不是最好的解决方案,因为它可能会停止整个应用程序。

如何正确避免这个问题?

此致!